题目地址:
https://leetcode.com/problems/last-substring-in-lexicographical-order/
给定一个长 n n n字符串 s s s,求其所有子串中字典序最大的那个子串。
可以借鉴字符串最小表示法的算法来做,思路参考https://blog.csdn.net/qq_46105170/article/details/125243122。与最小表示法不同的是,这里要求的是字典序最大的子串,所以不需要后面复制一份原串。同时容易知道,答案一定是某个后缀。代码如下:
public class Solution {
public String lastSubstring(String s) {
int n = s.length();
int i = 0, j = 1;
while (i < n && j < n) {
int k = 0;
while (i + k < n && j + k < n && s.charAt(i + k) == s.charAt(j + k)) {
k++;
}
if (i + k == n || j + k == n) {
break;
}
if (s.charAt(i + k) < s.charAt(j + k)) {
i += k + 1;
} else {
j += k + 1;
}
if (i == j) {
j++;
}
}
return s.substring(Math.min(i, j));
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。