[LeetCode] 1163. 按字典序排在最后的子串

248 阅读1分钟

👉 “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移动到rr指针后移
  • s[l] == s[r]k = 1,2,3,....,此时比较s[l + k]s[r + k],直到出现两者不相等的情况
  • s[l + k] < s[r + k]: l移动到rr指针后移
  • 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);
    }
};