【字符串】A052_LC_按字典序排在最後的子串(最大後綴)

一、Problem

Given a string s, return the last substring of s in lexicographical order.

Output: "bab"
Explanation: The substrings are ["a", "ab", "aba", "abab", "b", "ba", "bab"]. 
The lexicographically maximum substring is "bab".

Note:

1 <= s.length <= 4 * 10^5
s contains only lowercase English letters.

二、Solution

方法一:最大後綴

Q:爲什麼答案一定是字符串 s 的最大後綴?

反證法證明:假設這個字典序最大的子串是 ans,並且 ans 不是後綴,那麼 ans 連接上它後面的若干字符構成的新字符串的字典序一定比 ans 大,這和 s 是字典序最大的子串相矛盾,所以只有當 ans 是後綴且字典序最大的情況下,ans 是答案才能成立。

class Solution {
    public String lastSubstring(String s) {
        Set<Character> st = new TreeSet<>();
        for (char c : s.toCharArray()) 
            st.add(c);
        if (st.size() == 1)
            return s;
        
        StringBuilder sb = new StringBuilder();
        Object[] cs = st.toArray();

        for (int i = st.size()-1; i >= 0; i--) {
            sb.append(cs[i]);
            while (true) {
                if (s.contains(sb.toString()))
                    sb.append(cs[i]);
                else {
                    sb.deleteCharAt(sb.length()-1);
                    break;
                }
            }
        }
        return s.substring(s.indexOf(sb.toString()));
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章