前言:记得大二学习字符串匹配也只是把书上的伪代码看懂,原理搞明白,也就没有亲自去实现代码,而且自己也不是搞算法的,所以偶尔做题也很少遇到字符串匹配题,上次考试很尴尬遇到了这种题,虽然知道考的啥,但是写不出代码,很是尴尬,所以今天就花点时间把知识回顾一下,并把代码实现。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 }