一对一匹配,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

相关推荐

头像 会员标识
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务