KMP算法

Posted jx_yangbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法相关的知识,希望对你有一定的参考价值。

KMP算法:

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4 
  5 /* 朴素的模式匹配法 */
  6 int Index(string s, string t, int pos)
  7 {
  8     int i = pos;
  9     int j = 0;
 10     int len_1 = s.size();
 11     int len_2 = t.size();
 12     while(i<len_1 && j<len_2)
 13     {
 14         if(s[i] == t[j])
 15         {
 16             i++;
 17             j++;
 18         }
 19         else
 20         {
 21             i = i-j+1;
 22             j = 0;
 23         }
 24     }
 25     if(j>=len_2)
 26         return i-len_2;
 27     else
 28         return 0;
 29 }
 30 
 31 /* 通过计算返回子串T的next数组。 */
 32 void get_next(string T, int *next)
 33 {
 34     int len = T.size();
 35     int i = 0;
 36     int j = -1;
 37     next[0] = -1;
 38     while(i<len-1)
 39     {
 40         if(j==-1 || T[i]==T[j])
 41         {
 42             ++i;
 43             ++j;
 44             next[i] = j;
 45         }
 46         else
 47             j = next[j];
 48     }
 49 }
 50 /* KMP算法 */
 51 int Index_KMP1(string s, string t, int pos)
 52 {
 53     int i = pos;
 54     int j = 0;
 55     int size1 = s.size();
 56     int size2 = t.size();
 57     //int *next = new int[size1];
 58     int next[255] = {0};
 59     get_next(t,next);
 60     while(i<size1 && j<size2)
 61     {
 62         if(j==-1 || s[i]==t[j])
 63         {
 64             i++;
 65             j++;
 66         }
 67         else
 68         {
 69             j = next[j];
 70         }
 71     }
 72     if(j>=size2)
 73     {
 74         return i-size2;
 75     }
 76     else
 77         return 0;
 78 }
 79 
 80 /* 求模式串T的next函数修正值并存入数组nextval */
 81 void get_nextval(string T, int *nextval)
 82 {
 83     int len = T.size();
 84     int i = 0;
 85     int j = -1;
 86     nextval[0] = -1;
 87     while(i<len-1)
 88     {
 89         if(j==-1 || T[i]==T[j])
 90         {
 91             ++i;
 92             ++j;
 93             if(T[i] != T[j])
 94                 nextval[i] = j;
 95             else
 96                 nextval[i] = nextval[j];
 97         }
 98         else
 99             j = nextval[j];
100     }
101 }
102 
103 /* 改进的KMP算法 */
104 int Index_KMP2(string s, string t, int pos)
105 {
106     int i = pos;
107     int j = 0;
108     int size1 = s.size();
109     int size2 = t.size();
110     //int *next = new int[size1];
111     int nextval[255] = {0};
112     get_nextval(t,nextval);
113     while(i<size1 && j<size2)
114     {
115         if(j==-1 || s[i]==t[j])
116         {
117             i++;
118             j++;
119         }
120         else
121         {
122             j = nextval[j];
123         }
124     }
125     if(j>=size2)
126     {
127         return i-size2;
128     }
129     else
130         return 0;
131 }
132 
133 int main()
134 {
135     //char str_2[6] = "abcde";
136     //string str1 = "abcdex";
137     //string str2 = "abcabx";
138     //string str3 = "ababaaaba";
139     string str4 = "aaaaaaaab";
140 
141     string s1 = "abaabcabx";
142     string t1 = "abcabx"; 
143 
144     string s2 = "abcba";
145     string t2 = "cba"; 
146 
147     cout<<Index(s2,t2,0)<<endl;
148     cout<<Index_KMP1(s2,t2,0)<<endl;
149     cout<<Index_KMP2(s2,t2,0)<<endl;
150 
151     int arr1[255] = {0};
152     int arr2[255] = {0};
153     get_next(str4, arr1);
154     get_nextval(str4, arr2);
155     for(int i=0; i<str4.size(); i++)
156         cout<<arr1[i];
157     for(int i=0; i<str4.size(); i++)
158         cout<<arr2[i];
159 
160     /*string aa = "12345";
161     cout<<aa.size()<<endl;
162     for(int i=0;i<2;i++)
163         aa[i] = ‘a‘;
164     cout<<aa.size()<<endl;
165     cout<<aa<<endl;*/
166 
167     return 0;
168 }

 

以上是关于KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

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

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

图解KMP算法原理及其代码分析

Kmp算法Java代码实现