一对一匹配,KMP算法

from:https://www.cnblogs.com/yjiyjige/p/3263858.html

模板:

#include<iostream>
#include<string>
#include<cstring>

using namespace std;
const int N = 1e5;     //字符串最大长度
string s, t;             //s主串,t模式串
int Next[N];         //不匹配时需要移动的位置

void findNext() {
    int k = -1;
    int i = 0;
    memset(Next, -1, sizeof Next);
    while (i < t.length() - 1) {
        if (k == -1 || t[i] == t[k]) {       //有重复的字符时
            if (t[++i] == t[++k])      // 当两个字符相等时要跳过
                Next[i] = Next[k];
            else
                Next[i] = k;
        } else
            k = Next[k];
    }
}

int KMP() {
    int i = 0, j = 0;
    while (i != s.length() && j != t.length()) {
        if (j == -1 || s[i] == t[j]) {  //当j为-1时,要移动的是i,当然j也要归0
            i++;
            j++;
        } else
            j = Next[j];          //j回到指定位置
    }
    if (j == t.length())         //找到匹配的
        return i - j;
    else
        return -1;
}

int main() {
    cin >> s >> t;
    findNext();
    int tPos = KMP();
    if (tPos == -1)
        cout << "Not has t!" << endl;
    else
        cout << "t is in " << tPos << "!" << endl;
    return 0;
}

/*
Input:
bacbababadababacambabacaddababacasdsd
ababaca
Output:
t is in 10!
*/
全部评论
太强了吧
点赞 回复 分享
发布于 2020-01-31 10:52

相关推荐

07-11 10:56
门头沟学院 Java
码客明:大胆的说自己能实习6个月就行
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
05-27 14:57
西北大学 golang
强大的社畜在走神:27届真不用急,可以搞点项目、竞赛再沉淀沉淀,我大二的时候还在天天打游戏呢
投递华为等公司10个岗位
点赞 评论 收藏
分享
07-09 18:28
门头沟学院 Java
写着提前批,结果还要实习4个月以上???
程序员牛肉:这种不用看,直接投了,面试的时候问对应的HR就行。有可能他们是直接复制的暑期实习的模板。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务