JAVA程序设计:按字典序排在最后的子串(LeetCode:1163)

给你一个字符串 s,找出它的所有子串并按字典序排列,返回排在最后的那个子串。

 

示例 1:

输入:"abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"。
示例 2:

输入:"leetcode"
输出:"tcode"
 

提示:

1 <= s.length <= 4 * 10^5
s 仅含有小写英文字符。

思路:我们可以知道的是答案一定是原串的某一个后缀,并且这个后缀串一定是以原串中的最大字符开始,问题就是原串中可能有若干个最大字符,我们的问题就是如何快速的找到这个最大字符的位置使得获得的后缀串的字典序最大。我们采用快慢指针的方法(其实我暴力+剪枝也能过),其中慢指针用来找最佳的后缀起点,快指针负责向后遍历去找是否存在更大的字符,我们额外定义一个step用来遍历以当前两个相同大小字符开始的两个串。

class Solution {
    public String lastSubstring(String s) {

        int len = s.length();
        int l = 0, r = 1, step = 0;

        while (r + step < len) {
            if (s.charAt(r + step) == s.charAt(l + step))
                step++;
            else {
                if (s.charAt(r + step) > s.charAt(l + step)) l = r++;
                else r = r + step + 1;
                step = 0;
            }
        }

        return s.substring(l);
    }
}

 

你可能感兴趣的:(JAVA程序设计:按字典序排在最后的子串(LeetCode:1163))