题目:
给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。
示例 1:
输入:s = "abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"。
示例 2:
输入:s = "leetcode"
输出:"tcode"
提示:
1 <= s.length <= 4 * 105
s 仅含有小写英文字符。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/last-substring-in-lexicographical-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
首先将问题转化为:选择一个起点,使得从该点开始的子字符串最大
int两个位置变量l和r,初识时l=0,r=l+1
先固定l,移动r
每移动一次r,比较l和r,如果r大于l,就把l换成r;
如果s[l]==s[r],进一步比较l+1和r+1,l+2和r+2...l+k和r+k,如果相等就k++再比较,直到某一个更大
上述比较完成后,移动r,重复该过程
代码:
class Solution {
public:
string lastSubstring(string s) {
int l = 0,r = l + 1,k = 0,n = s.size();
while(r + k < n)
{
if(s[r + k] == s[l + 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 = l + 1;
k = 0;
}
else
{
r++;
k = 0;
}
}
return s.substr(l);
}
};