数据结构 字串的模式匹配 KMP算法

举报
悦来客栈的老板 发表于 2020/12/29 00:24:54 2020/12/29
【摘要】 #include <stdio.h>#include <stdlib.h> #define OK 1#define ERROR 0#define OVERFLOW -2 typedef struct{ char *ch; int length;}String; void Init_String(String &T){ T.ch = NULL; ...

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define OK 1
  4. #define ERROR 0
  5. #define OVERFLOW -2
  6. typedef struct
  7. {
  8. char *ch;
  9. int length;
  10. }String;
  11. void Init_String(String &T)
  12. {
  13. T.ch = NULL;
  14. T.length = 0;
  15. }
  16. int StrAssign(String &T, char *chars)
  17. {
  18. int i;
  19. int len;
  20. char *p = chars;
  21. if (T.ch)
  22. {
  23. free(T.ch);
  24. }
  25. for (len = 0;*p != '\0'; ++len,++p);
  26. if (!len)
  27. {
  28. T.ch = NULL;
  29. T.length = 0;
  30. }
  31. else
  32. {
  33. T.ch = (char *)malloc(len * sizeof(char));
  34. if (!T.ch)
  35. {
  36. exit(OVERFLOW);
  37. }
  38. for (i=0; i<len; i++)
  39. {
  40. T.ch[i] = chars[i];
  41. }
  42. T.length = len;
  43. }
  44. return OK;
  45. }
  46. void get_next(String T, int next[])
  47. {
  48. int i = 0;
  49. int j = -1;
  50. next[0] = -1;
  51. while (i<T.length)
  52. {
  53. if (j == -1 || T.ch[i] == T.ch[j])
  54. {
  55. ++i;
  56. ++j;
  57. next[i] = j;
  58. }
  59. else
  60. {
  61. j = next[j];
  62. }
  63. }
  64. }
  65. int Index_KMP(String S, String T, int pos)
  66. {
  67. int i = pos;
  68. int j = -1;
  69. int next[255];
  70. get_next(T,next);
  71. while (i<S.length && j <T.length )
  72. {
  73. if (j == -1 || S.ch[i] == T.ch[j])
  74. {
  75. ++i;
  76. ++j;
  77. }
  78. else
  79. {
  80. j = next[j];
  81. }
  82. }
  83. if (j == T.length )
  84. {
  85. return i-T.length + 1 ;
  86. }
  87. else
  88. return 0;
  89. }
  90. int main()
  91. {
  92. String S,T;
  93. Init_String(S);
  94. Init_String(T);
  95. StrAssign(S,"abcdefghijklmm");
  96. StrAssign(T,"cdef");
  97. printf("%d\n",Index_KMP(S,T,0));
  98. return 0;
  99. }

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/17249191

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。