5069. 按字典序排在最后的子串
给你一个字符串 s
,找出它的所有子串并按字典序排列,返回排在最后的那个子串。
示例 1:
输入:"abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"。
示例 2:
输入:"leetcode"
输出:"tcode"
提示:
1 <= s.length <= 10^5
- s 仅含有小写英文字符
注意的是要保证内存消耗和时间消耗尽量小。
class Solution {
public:
// 判断字典序大小
bool judge(string a, string b)
{
int N = min(a.size(), b.size());
int i = 0;
//cout << a[0] << ' ' << a.size();
while (a[i] == b[i] && (++i) < N);
if (i == N)
{
if (a.size() > b.size())
return 1;
else
return 0;
}
if (a[i] > b[i])
return 1;
else
return 0;
}
string lastSubstring(string s) {
char max = 0;
int n = 0;
//找出最大的字符
for (int i = 0; i < s.size(); i++)
{
if (s[i] > max)
{
max = s[i];
}
}
//k表示最大字符所在的索引,k_max表示连续出现最大值的最大次数
int k = s.find(max), k_max = 0, xiabiao;
string res;
string p(s);
while (k != -1) //可能存在多个最大字符,需要充分判断
{
s[k] = '*';
int add = 1;
while (s[k + add] == max)
{
s[k + add] = '*';
add++; //add表示连续出现max的次数
}
if (add - 1 > k_max)
{
k_max = add - 1;
xiabiao = k;
res = p.substr(k, s.size());
}
else if (add - 1 == k_max) //连续最大次数相等需要进一步比较字典序
{
string b = p.substr(k, s.size());
res = judge(b, res) ? b : res; //返回字典序大的
}
k = s.find(max);
}
return res;
}
};