学习KMP算法时想到的另一种好方法
KMP是一种简化的字符串匹配的方法,思路并没有那么简单。
对于简单的给定的字符串和子串,用c++string库中的substr方法就可以很简单的做到字符匹配!
比如pta上的7-3 病毒感染检测:
作者:王东
单位:贵州师范大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染。(注意,人的DNA序列是线性的,而病毒的DNA序列是环状的)
输入格式:
输入第一行中给出1个整数i(1≤i≤11),表示待检测的病毒DNA和患者DNA的对数。 输入i行串序列,每行由两个字符串组成(字符串中不含不可见字符),两字符串之间用一个空格分隔,分别代表病毒的DNA序列和患者的DNA序列,病毒的DNA序列和患者的DNA序列长度不超过500。
输出格式:
依次逐行输出每对检测样本的结果,感染输出:YES,未感染输出:NO。
输入样例1:
1
baa bbaabbba
输出样例1:
YES
输入样例2:
2
cced cdccdcce
bcd aabccdxdxbxa
输出样例2:
YES
NO
就可以用如下代码实现:
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 void reverse(string &a){//将字符串反转 5 int m=a.length(); 6 string d=a; 7 for(int i=0;i<m-1;i++){ 8 a[i]=a[i+1]; 9 } 10 a[m-1]=d[0]; 11 } 12 int compare(string &c,string &a,int q){//将字符串进行比较 13 string d=a; 14 int flag=0; 15 for(int i=0;i<q-1;i++){ 16 reverse(d); 17 if(c==a||c==d){ 18 flag=1; 19 break; 20 } 21 else flag=0; 22 } 23 return flag; 24 } 25 int main() 26 { 27 string a,b,c,d,e; 28 int n,m,q,flag=0; 29 cin>>n; 30 while(n--){ 31 cin>>a; 32 cin>>b; 33 d=a; 34 q=b.length()-a.length(); 35 for(int j=0;j<=b.length()-a.length();++j){ 36 c=b.substr(j,a.length()); 37 if(compare(c,a,q)){ 38 flag=1; 39 break; 40 } 41 else flag=0; 42 } 43 if(flag) cout<<"YES"<<endl; 44 else cout<<"NO"<<endl; 45 } 46 return 0; 47 }
这样子真的简便了特别多!
但是这是一种偷懒的写法,需要对算法规模简化的话还是需要用到kmp算法!