字符串各类模板(持续更新)

这篇博客介绍了字符串处理的一些经典算法,包括KMP算法用于字符串匹配,马拉车算法计算最长回文串,以及如何构建后缀数组。KMP算法在O(n+m)的时间复杂度内完成匹配,马拉车算法实现O(n)的时间复杂度求最长回文串,后缀数组构建方法用于求解最长公共前后缀。
摘要由CSDN通过智能技术生成
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;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值