当前位置:网站首页>LeetCode 1163. 按字典序排在最后的子串
LeetCode 1163. 按字典序排在最后的子串
2022-08-07 06:12:00 【Sasakihaise_】

【最小表示法】
最小表示法用在从一个循环字符串(或者不循环)的字符串中找到最小(大)的子串。
例如:从abaabczbzd这个串中找到zd这个最大字典序子串或者zdabaabczb这样一个子串,暴力法就是从每个位置切割字符串,但是这样需要保存n*n个字符串再排序,必然MLE
因此最小表示法的精髓在于,每次都比较两个错开的子串,如果[i + k] == [j + k] (i != j),说明这两个字符串一直都是相同的,但是我们让其错开了,所以长的那个是大的,也就是aaa,aaaa这种情况。如果k达到一个值的时候[i + k] > [j + k],则以j开头的永远不可能比以i开头的大了,也就是aab, aaa这种情况
同时以j + k开头的比必然有以i + k开头的比他大,所以这时候j直接从j + k + 1开始继续去和i 开头的去比较。当[i + k] < [j + k]时同理。
所以(最大表示法)算法流程为:
1.初始化 i = 0, j = 1, k = 0;
2.比较[i + k] 与 [j + k] 如果相等继续比较;
3.若[i + k] > [j + k] , 则 j = j + k + 1, 否则 i = i + k + 1;
4.若第3步执行后i == j, 令任意一个++;
5.取min(i, j)。
举几个:
1.abab
(1) i = 0, j = 1, k = 0时:s[i + k] = s[0 + 0] = a, s[j + k] = s[1 + 0] = b, a < b, 故i = i + k + 1 = 1. 但是此时i==j,故将++i = 2
(2) i = 2, j = 1, k = 0: s[i + k] = s[2 + 0] = a, s[j + k] = s[1 + 0] = b, a < b, 故i = i + k + 1 = 3
(3) i = 3, j = 1, k = 0: s[i + k] = s[3 + 0] = b, s[j + k] = s[1 + 0] = b, a == b, 故k++
(4) i = 3, j = 1, k = 1: i + k = 3 + 1 = 4, 跳出循环
(5) 最终取min(i, j) = min(3, 1) = 1,所以最终答案为"bab"
2.aaab
(1) i = 0, j = 1, k = 0时:s[i + k] = s[0 + 0] = a, s[j + k] = s[1 + 0] = a, a == a, 故k++
(2) i = 0, j = 1, k = 1时:s[i + k] = s[0 + 1] = a, s[j + k] = s[1 + 1] = a, a == a, 故k++
(1) i = 0, j = 1, k = 2时:s[i + k] = s[0 + 2] = a, s[j + k] = s[1 + 2] = b, a < b, 故i = i + k + 1 = 0 + 2 + 1 = 3
(2) i = 3, j = 1, k = 0: s[i + k] = s[3 + 0] = b, s[j + k] = s[1 + 0] = a, b > a, 故j = j + k + 1 = 1 + 0 + 1 = 2
(3) i = 3, j = 2, k = 0: s[i + k] = s[3 + 0] = b, s[j + k] = s[2 + 0] = a, b > a, 故j = j + k + 1 = 2 + 0 + 1 = 3, 但是此时i == j,将其中一个++
(4) i = 4, j = 3, k = 0: i 超范围了,跳出循环
(5) 最终取min(i, j) = min(4, 3) = 3,所以最终答案为"b"
class Solution {
public String lastSubstring(String s) {
int n = s.length();
if (n == 1) return s;
int i = 0, j = 1, ans = 0;
while (i < n && j < n) {
int k = 0;
while (i + k < n && j + k < n && s.charAt(i + k) == s.charAt(j + k)) k++;
if (i + k == n || j + k == n) break;
if (s.charAt(i + k) > s.charAt(j + k)) {
j = j + k + 1;
} else {
i = i + k + 1;
}
if (i == j) j++;
}
ans = Math.min(i, j);
return s.substring(ans);
}
}class Solution {
public:
// 最小表示法 5:00
string lastSubstring(string s) {
int i = 0, j = 1, k = 0;
int n = s.size();
while (i < n && j < n) {
k = 0;
while (i + k < n && j + k < n && s[i + k] == s[j + k]) k++;
if (i + k == n || j + k == n) break;
if (s[i + k] > s[j + k]) {
j = j + k + 1;
} else {
i = i + k + 1;
}
if (i == j) i++;
cout<<i<<j<<endl;
}
cout<<i<<j<<min(i, j)<<endl;
return s.substr(min(i, j));
}
};
边栏推荐
猜你喜欢
随机推荐
Tag: top stack
“蔚来杯“2022牛客暑期多校训练营3
开发依赖vs生产依赖
mysql获取当前时间
devserver 的配置
基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
测试用例经典练习之微信发红包测试用例
DOM,SAX,JDOM,DOM4J四种方法对比总结
Spark基础【运行架构、RDD】
The permutation sequence of the 60th question in C language.Breadth-first search, simple division positioning
本机下载mysql.5.7.10远程安装至另一服务器(免安装版配置)
手写一个electron本地音乐播放器
用账户名和密码登录测试用例
R语言sys函数系列(一)
This beta version of Typora is expired
Scrapy抓取知乎网站
某音App protobuf协议还原逆向分析
The regular expression of the shell and the Three Musketeers grep command
VoLTE基础自学系列 | IMS网络中的IP层路由寻址过程(注册流程中的实现)
360全网数字安全大脑获“数字经济创新引领成果”奖项









