KMP
string s;
int nxt[100000];
//计算nxt数组;
//时间复杂度O(n)
void cal_next(string s){
nxt[0]=-1;
int k=-1, j=0, len=s.size();
while(j<len){
if(k==-1||s[k]==s[j]){
k++;
j++;
nxt[j]=k;
}
else k=nxt[k];
}
}
//将str与text匹配;
//时间复杂度O(n+m)
int KMP(string text, string str) {
//text表示原串, str表示待匹配串;
cal_next(str);
int n = text.size();
int m = str.size();
int j = 0;
for (int i = 0; i < n; i++) {
while (j && text[i] != str[j])
j = nxt[j];
if (str[j] == text[i])
j++;
if (j == m)
return 1;
}
return 0;
}
//最小字符串;
//时间复杂度O(n)
void get_minString(string s){
int len=s.size();
int i=0, j=1, k=0;
while(i<len&&j<len&&k<len){
int t=s[(i+k)%len]-s[(j+k)%len];
if(t==0) k++;
else{
if(t>0) i+=k+1;
else j+=k+1;
if(i==j) j++;
k=0;
}
}
int id=min(i, j);//id表示最小位置的起点;
string tem;
tem=s.substr(id, len-id)+s.substr(0, id);
cout << "min: " << tem << endl;
return;
}
//最大字符串;
//时间复杂度O(n)
void get_maxString(string s){
int len=s.size();
int i=0, j=1, k=0;
while(i<len&&j<len&&k<len){
int t=s[(i+k)%len]-s[(j+k)%len];
if(t==0) k++;
else{
if(t>0) j+=k+1;
else i+=k+1;
if(i==j) j++;
k=0;
字符串各类模板(持续更新)
最新推荐文章于 2024-08-20 09:52:32 发布
这篇博客介绍了字符串处理的一些经典算法,包括KMP算法用于字符串匹配,马拉车算法计算最长回文串,以及如何构建后缀数组。KMP算法在O(n+m)的时间复杂度内完成匹配,马拉车算法实现O(n)的时间复杂度求最长回文串,后缀数组构建方法用于求解最长公共前后缀。
摘要由CSDN通过智能技术生成