串的模式之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 1010),为待匹配的模式串的个数。随后 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算法实践题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之KMP算法

Kmp算法浅谈

数据结构—串KMP模式匹配算法

数据结构串---KMP模式匹配算法之获取next数组

求出子串(模式串)的next函数值,利用kmp算法实现模式与主串的匹配算法

第四章学习小结