一、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()));
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,