kmp模板
算法步骤:
一.求next数组:
双指针假设从0开始,如果前后一样就让next[j]的值变成已经匹配好的数目i+1。
如果不一样则前指针不断动归跳已经算出来的next如果能继续匹配就继续,直到如果跳到开头还是和末尾匹配不上就让末尾j++。
二.主串和模式串匹配:
双指针一个j指向主串t一个i指向模式串s,如果一样就同时向后,之后有2种情况。
一种是模式串全部匹配成功,判断条件为i==lens。
另一种是失配,模式串不断跳next,能继续匹配就继续,跳到开头都匹配不上就主串j++。
std::function<void(char*,int,int*)> getnext = [&](char* s, int len, int nxt[]) { int i = 0, j = 1; while (j < len) { if (s[i] == s[j]) nxt[j] = i+1,i++,j++; else if (i == 0) j++; else i = nxt[i-1]; } }; std::function<void(char*,int,char*,int,int*)> kmp = [&](char* s, int lens, char* t, int lent, int nxt[]) { int i = 0, j =0; while (j < lent) { if (s[i] == t[j]) i++, j++; else if (i == 0) j++; else i = nxt[i-1]; if (i == lens) { /*do something*/ } } };