LeetCode 1163. 按字典序排在最后的子串
题目描述
思路分析
解法一:双指针比较最大后缀(推荐)
核心思路:
- 维护两个起点
i、j,并比较从其开始的后缀。- 若
s[i+k] < s[j+k],说明i不可能是答案,跳到j。- 否则移动
j到j+k+1继续比较。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1)。
class Solution {
public String lastSubstring(String s) {
int n = s.length();
int i = 0;
int j = 1;
int k = 0;
while (j + k < n) {
char a = s.charAt(i + k);
char b = s.charAt(j + k);
if (a == b) {
k++;
} else if (a < b) {
i = j;
j = i + 1;
k = 0;
} else {
j = j + k + 1;
k = 0;
}
}
return s.substring(i);
}
}
func lastSubstring(s string) string {
n := len(s)
i, j, k := 0, 1, 0
for j+k < n {
a := s[i+k]
b := s[j+k]
if a == b {
k++
} else if a < b {
i = j
j = i + 1
k = 0
} else {
j = j + k + 1
k = 0
}
}
return s[i:]
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 521. 最长特殊序列 I | 简单 | 字符串 |
| 522. 最长特殊序列 II | 中等 | 字符串 |
| 1392. 最长快乐前缀 | 困难 | 字符串 |
| 1163. 按字典序排在最后的子串 | 困难 | 双指针 |
| 1044. 最长重复子串 | 困难 | 字符串 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!