KMP算法


KMP算法算是我接触的第一个字符串算法,以前不理解,现在稍微理解了,谨以此记。

KMP算法最核心的部分是NEXT数组,也就是模式串匹配的真前缀与真后缀的关系。

对于字符串"abca"的真前缀和真后缀都是a即next数组里的next[4]=1;

next数组next[i]表示的是下表从1-i的真后缀等于真前缀的字符数。

如字符串T”abd“与字符串S”abcdabc“匹配,发现第三个字母d与c不相等,然后找next[2]=0,T串从0也就是a开始与c匹配

T串下标是从0开始,S串是1开始,next数组是S串的真前后缀匹配数;大概就这样;

最核心的是next数组代码;博主手动在网页敲的难免会有瑕疵。

 1 int next[100];
 2 void getnext(string &s)
 3 {
 4     int j=0;//T串的下标指针 
 5     next[1]=0;//s串第一个元素是自己没有真前后缀;
 6     for(int i=2;i<=s.size();i++)
 7     {
 8         while(j&&s[i]!=s[j+1])j=next[j]//同一个串的下标转换
 9         if(s[i]==s[j+1])j++;
10         next[i]=j; 
11      } 
12  } 

第一次用这个网页写好不熟悉啊!

这样KMP算是完整结束了,思想和代码都结束了。

leetcode 28实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 。

 1 class Solution {
 2 public:
 3     int strStr(string haystack, string needle) {
 4         int n=needle.size();
 5         if(!n)return 0;
 6         int next[n+2];
 7         next[1]=0;
 8         int j=0;
 9         for(int i=2;i<=n;i++)
10         {
11             while(j&&needle[i-1]!=needle[j])j=next[j];
12             if(needle[i-1]==needle[j])j++;
13             next[i]=j;
14         }
15         j=0;
16        for(int i=1;i<=haystack.size();i++)
17        {
18          while(j&&haystack[i-1]!=needle[j])j=next[j];
19          if(haystack[i-1]==needle[j])j++;
20          if(j==n)return i-n;
21          
22        }
23     return -1;
24     }
25 };

相关