串的模式之kmp算法实践题
Posted yewanting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串的模式之kmp算法实践题相关的知识,希望对你有一定的参考价值。
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。
本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:
- 数据0:小规模字符串,测试基本正确性;
- 数据1:随机数据,String 长度为 10510^510?5??,Pattern 长度为 101010;
- 数据2:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10210^210?2??;
- 数据3:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10310^310?3??;
- 数据4:随机数据,String 长度为 10510^510?5??,Pattern 长度为 10410^410?4??;
- 数据5:String 长度为 10610^610?6??,Pattern 长度为 10510^510?5??;测试尾字符不匹配的情形;
- 数据6:String 长度为 10610^610?6??,Pattern 长度为 10510^510?5??;测试首字符不匹配的情形。
输入格式:
输入第一行给出 String,为由英文字母组成的、长度不超过 10610^610?6?? 的字符串。第二行给出一个正整数 NNN(≤10le 10≤10),为待匹配的模式串的个数。随后 NNN 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10510^510?5?? 的字符串。每个字符串都非空,以回车结束。
输出格式:
对每个 Pattern,按照题面要求输出匹配结果。
输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
输出样例:
abcabcacabxy
Not Found
Not Found
解题思路:看到这道题无疑就是用kmp算法;下面的代码就是kmp算法的模板?用一个ans记录它是否找到;
具体的kmp算法思想在我前面的博客有:链接如下:
https://www.cnblogs.com/yewanting/p/10674340.html
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int next1[1000005]; 6 void getnext(string t ,int tsize) 7 { 8 int k = -1 ; 9 int j = 0; 10 next1[0] = -1; 11 while(j<tsize-1) 12 { 13 if(k==-1||t[j] == t[k]) 14 { 15 ++j; 16 ++k; 17 next1[j] = k; 18 }else 19 k = next1[k]; 20 21 } 22 } 23 24 int kmp(string s ,string t ,int ssize,int tsize) 25 { 26 int i = 0 ; 27 int j = 0 ; 28 while(i<ssize&&j<tsize) 29 { 30 if(j==-1||s[i]==t[j]) 31 { 32 i++; 33 j++; 34 }else 35 { 36 j = next1[j]; 37 } 38 } 39 if(j==tsize) 40 { 41 return i-j+1; 42 }else 43 return -1; 44 } 45 string s ; 46 string t ; 47 int n ; 48 int ssize; 49 int tsize; 50 int ans ; 51 int main() 52 { 53 cin>>s; 54 cin>>n; 55 ssize = s.size(); 56 while(n--) 57 { 58 cin>>t; 59 tsize = t.size(); 60 getnext(t,tsize); 61 ans = kmp(s,t,ssize,tsize); //用一个ans来记录是否找到匹配 62 if(ans==-1) //若找不到 63 { 64 printf("Not Found "); 65 }else //找到,则输出后面的字符; 66 { 67 for(int i = ans-1 ;i < ssize; i++) 68 { 69 cout<<s[i]; 70 } 71 cout<<endl; 72 } 73 74 } 75 return 0; 76 }
以上是关于串的模式之kmp算法实践题的主要内容,如果未能解决你的问题,请参考以下文章