模板 KMP

void getNext(string t, vector<int> &nxt) {//求出字符串t的next数组
	nxt.resize(t.size() + 1);
    for(int i = 1, j = 0; i < t.size(); i++) {
    	while(j && t[i] != t[j]) {
            j = nxt[j];
        }
        j += (t[i] == t[j]);
        nxt[i + 1] = j;
    }
}
 
int find(string s, string t) {//在字符串s中寻找字符串t第一次出现的位置,没找到则返回-1
    vector<int> nxt;
    getNext(t, nxt);
    for(int i = 0, j = 0; i < s.size(); i++) {
        while(j && s[i] != t[j]) {
            j = nxt[j];
        }
        j += (s[i] == t[j]);
        if(j == t.size()) {
            return i - t.size() + 2;
        }
    }
    return -1;
}
 
bool find(string s, string t, vector<int> &ans) {//在字符串s中寻找字符串t所有出现的位置,没找到则返回false
    ans.clear();
    vector<int> nxt;
    getNext(t, nxt);
    for(int i = 0, j = 0; i < s.size(); i++) {
        while(j && s[i] != t[j]) {
            j = nxt[j];
        }
        j += (s[i] == t[j]);
        if(j == t.size()) {
            ans.emplace_back(i - t.size() + 2);
            j = nxt[j];
        }
    }
    return !ans.empty();
}
posted @ 2023-07-29 02:10  wuyoudexian  阅读(13)  评论(0)    收藏  举报