👉 “Offer 驾到,掘友接招!我正在参与2022春招打卡活动点击查看 活动详情。
1163. 按字典序排在最后的子串
难度:困难
给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。
示例 1:
输入:s = "abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"。
示例 2:
输入:s = "leetcode"
输出:"tcode"
提示:
- 1 <= s.length <= 4 * 105
- s 仅含有小写英文字符。
解题思路
双指针,指针l记录字典序最大子串的首位下标,指针r向后扫描并与指针l进行比较
s[l] > s[r]:r指针后移s[l] < s[r]:存在更大的子串,l移动到r,r指针后移s[l] == s[r]:k = 1,2,3,....,此时比较s[l + k]与s[r + k],直到出现两者不相等的情况s[l + k] < s[r + k]:l移动到r,r指针后移s[l + k] > s[r + k]:l不动,r移动到r + k + 1
最终答案必然是一个后缀子串
代码
class Solution {
public:
string lastSubstring(string s) {
int l = 0, r = 1, k = 0, n = s.size();
while(r + k < n){
if(s[l + k] == s[r + k]) k++;
else if(s[l] < s[r + k]){
l = r + k;
r = l + 1;
k = 0;
}
else if(s[l + k] < s[r + k]){
l = r;
r++;
k = 0;
}
else{
r++;
k = 0;
}
}
return s.substr(l);
}
};