解题思路
本题要求从所有起始片段的整理后片段中按字典序找出第 k 小的那一个。直接生成所有整理后片段并排序的复杂度太高,需要利用计数的思路进行比较和排序。
-
预处理前缀计数
设 cnt[i][d] 表示字符串 s 的前 i 个字符中,字母 'a'+d 出现的次数。同时维护 max_letter[i],表示前 i 个字符中出现过的最大的字母索引('a' 为 0,'z' 为 25)。该数组可以在线性时间内递推求得。
-
自定义比较函数(整理后片段 ti 与 tj 的字典序比较)
由于整理后片段是将对应起始片段(前缀)内部字符按 a 到 z 排序后得到的,因此其结构可以仅用计数数组表示。比较时,从 'a' 到 'z' 依次考虑每个字母 d: