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*/
    }
  }
};

 

posted @ 2020-08-24 21:44  Kimyon  阅读(173)  评论(0编辑  收藏  举报