首页 > 代码库 > KMP算法
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 else121 {122 j = nextval[j];123 }124 }125 if(j>=size2)126 {127 return i-size2;128 }129 else130 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算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。