前言:記得大二學習字符串匹配也只是把書上的偽代碼看懂,原理搞明白,也就沒有親自去實現代碼,而且自己也不是搞算法的,所以偶爾做題也很少遇到字符串匹配題,上次考試很尷尬遇到了這種題,雖然知道考的啥,但是寫不出代碼,很是尷尬,所以今天就花點時間把知識回顧一下,並把代碼實現。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1:模式匹配
模式匹配(Pattern Matching) 即子串定位運算(Index函數)。
算法目的:確定主串中所含子串第一次出現的位置(定位) ——即如何實現 Index(S,T,pos)函;
初始條件:串S和T存在,T是非空串,1≤pos≤StrLength(s) 操作結果:
若主串S中存在和串T值相同的子串,則返回它在主串S中第pos個字符之后第一次出現的位置;否則函數值為0。
注:S稱為被匹配的串,T稱為模式串。若S包含串T,則稱“匹配成功”。否則稱 “匹配不成功” 。
常見的兩種算法:
BF算法 (又稱古典或經典的、朴素的、窮舉的)
KMP算法(特點:速度快)
2:BF算法
① BF算法設計思想: 將主串的第pos個字符和模式的第1個字符比較, 若相等,繼續逐個比較后續字符;
若不等,從主串的下一字符(pos+1)起,重新與第一個 字符比較。
直到主串的一個連續子串字符序列與模式相等 。返回值為S中與T匹配的子序列第一個字符的序號,即匹配成功。 否則,匹配失敗,返回值 0 .

BF算法的偽代碼:

算法C++實現
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 int BF(string a,int stra,string b,int strb) 5 { 6 int i=0; 7 int j=0; 8 while(i<stra && j<strb) 9 { 10 if(a[i]==b[j]) 11 { 12 i++; 13 j++; 14 } 15 else 16 { 17 i=i-j+1; 18 j=0; 19 } 20 } 21 if(j>=strb){ 22 cout << "匹配成功"; 23 return i-strb; 24 } else 25 { 26 cout << "匹配失敗"; 27 return 0; 28 } 29 } 30 int main() 31 { 32 string a,b; 33 cin >> a >> b; 34 int stra=a.length(); 35 int strb=b.length(); 36 BF(a,stra,b,strb); 37 return 0; 38 }

3:KMP算法








算法C++實現
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 int next[1000]; 5 void get_next(string str,int stra) 6 { 7 int i=1; 8 next[1]=0; 9 int j=0; 10 while(i<stra) 11 { 12 if(j==0 || str[i]==str[j]) 13 { 14 ++i; 15 ++j; 16 next[i]=j; 17 }else 18 { 19 j=next[j]; 20 } 21 } 22 } 23 24 int KMP(string a,int stra,string b,int strb) 25 { 26 int j=1; 27 int i=0; 28 while(i<stra && j<=strb) 29 { 30 if(j==0 || a[i]==b[j-1] ){ 31 i++; 32 j++; 33 } 34 else 35 { 36 j=next[j]; 37 } 38 } 39 if(j>strb) { 40 cout << "匹配成功" << endl; 41 return i-strb; 42 }else 43 { 44 cout << "匹配失敗" << endl; 45 return -1; 46 } 47 } 48 int main() 49 { 50 memset(next,0,sizeof(next)); 51 string a,b; 52 cin >> a >> b; 53 int stra=a.length(); 54 int strb=b.length(); 55 get_next(b,strb); 56 int m=KMP(a,stra,b,strb); 57 if(m!=-1) 58 { 59 cout << "匹配的位置在" << m << endl; 60 } 61 return 0; 62 }
