[关闭]
@rg070836rg 2016-01-26T13:34:45.000000Z 字数 929 阅读 1287

kmp算法

data_structure

一、kmp算法的核心思想

KMP算法的想法是,设法利用某些已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。

二、具体实现

具体的算法实现不说了,书上都有,很详细。
下面贴上做了对于长连续串next数组的优化的代码

  1. int kmp(const char *src,const char *dst)
  2. {
  3. int i=0;//记录源串信息
  4. int j=0;//记录子串信息
  5. int n=strlen(src);
  6. int m=strlen(dst);
  7. //next数组存的是,如果匹配失败,j回到next[j],i不变,继续比较、
  8. while(i<n && j<m)//当字符没有到底,进行比较
  9. {
  10. if (j==-1 || src[i]==dst[j])//如果当前字符相等,后移继续比较,若不等,取next数组中值,开始比较
  11. {
  12. i++; j++;
  13. }
  14. else
  15. j=next[j];
  16. }
  17. if (j>=m)
  18. return i-m; //返回
  19. else
  20. return -1; //没有找到
  21. }
  22. void GetNext(const char *str)
  23. {
  24. int m=strlen(str);
  25. int j=0;int k=-1;
  26. next[0]=-1;
  27. while (j<m-1)
  28. {
  29. //以前一种符合的状态为基准,判断现在的状态,如果继续符合,值加1,否则回到之前从比
  30. if(k==-1||str[j]==str[k])//如果刚进来,则k++,并把值存入next数组。
  31. {
  32. j++; k++;
  33. next[j] = k;
  34. if (str[j]==str[k])
  35. next[j] = next[k];
  36. }
  37. else
  38. k=next[k]; //回到之前。
  39. }
  40. }

三、测试

测试一下:

  1. int main()
  2. {
  3. char str[20]="aaaabcdabcda";
  4. char a[10]="abc";
  5. cout<<str<<endl<<a<<endl;
  6. GetNext(a);
  7. cout<<kmp(str,a)<<endl;
  8. char str1[20]="abcdabcda";
  9. char a1[10]="aaaabc";
  10. cout<<str1<<endl<<a1<<endl;
  11. GetNext(a1);
  12. cout<<kmp(str,a1)<<endl;
  13. return 0;
  14. }

结果:
此处输入图片的描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注