学习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算法!

posted @ 2020-05-06 12:28  peach1  阅读(179)  评论(0编辑  收藏  举报