[关闭]
@Pollux 2017-04-03T07:17:45.000000Z 字数 789 阅读 802

KMP 算法

PathToYou


参考:结构之法,算法之道阮一峰 字符串匹配的 KMP 算法

KMP

# KmpSearch.cpp

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int next[101];
  5. void GetNext(char* p,int next[])
  6. {
  7. int pLen = strlen(p);
  8. next[0] = -1;
  9. int k = -1;
  10. int j = 0;
  11. while (j < pLen - 1)
  12. {
  13. //p[k]表示前缀,p[j]表示后缀
  14. if (k == -1 || p[j] == p[k])
  15. {
  16. ++k;
  17. ++j;
  18. next[j] = k;
  19. }
  20. else
  21. {
  22. // k 回溯,寻找长度更短的相同前缀后缀
  23. k = next[k];
  24. }
  25. }
  26. }
  27. int KmpSearch(char* s, char* p)
  28. {
  29. int i = 0;
  30. int j = 0;
  31. int sLen = strlen(s);
  32. int pLen = strlen(p);
  33. while (i < sLen && j < pLen)
  34. {
  35. //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
  36. if (j == -1 || s[i] == p[j])
  37. {
  38. i++;
  39. j++;
  40. }
  41. else
  42. {
  43. //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
  44. //next[j]即为j所对应的next值
  45. j = next[j];
  46. }
  47. }
  48. //若在 S 主串中找到 P 模式串,则返回在 S 中对应 P 第一个位置的下标;若未找到这样的子串,则返回 -1
  49. if (j == pLen)
  50. return i - j;
  51. else
  52. return -1;
  53. }
  54. int main(){
  55. char s[100],p[100];
  56. strcpy(s,"BBC ABCDAB ABCDABCDABDE");
  57. strcpy(p,"ABCDABD");
  58. GetNext(p,next);
  59. cout<<KmpSearch(s,p)<<endl;
  60. return 0;
  61. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注