• 串的模式之kmp算法实践题


    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

    本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

    • 数据0:小规模字符串,测试基本正确性;
    • 数据1:随机数据,String 长度为 10510^5105​​,Pattern 长度为 101010
    • 数据2:随机数据,String 长度为 10510^5105​​,Pattern 长度为 10210^2102​​
    • 数据3:随机数据,String 长度为 10510^5105​​,Pattern 长度为 10310^3103​​
    • 数据4:随机数据,String 长度为 10510^5105​​,Pattern 长度为 10410^4104​​
    • 数据5:String 长度为 10610^6106​​,Pattern 长度为 10510^5105​​;测试尾字符不匹配的情形;
    • 数据6:String 长度为 10610^6106​​,Pattern 长度为 10510^5105​​;测试首字符不匹配的情形。

    输入格式:

    输入第一行给出 String,为由英文字母组成的、长度不超过 10610^6106​​ 的字符串。第二行给出一个正整数 NNN≤10le 1010),为待匹配的模式串的个数。随后 NNN 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10510^5105​​ 的字符串。每个字符串都非空,以回车结束。

    输出格式:

    对每个 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 }
  • 相关阅读:
    接口自动化框架脚手架从Excel读取用例发起调用做断言
    复盘|接口自动化测试框架建设的经验与教训
    设计模式|理解单一职责原则
    吃透50个常用的SQL语句,面试趟过
    华为云发布三大生态举措,携手伙伴及开发者共创新价值
    3分钟整明白 缓存热点 是咋回事
    学妹一反常态主动联系我,我要不要答应帮她?
    手把手教你把 Git 子模块更新到主项目
    缓存穿透详解及解决方案
    3分钟整明白啥是 缓存雪崩
  • 原文地址:https://www.cnblogs.com/yewanting/p/10706793.html
Copyright © 2020-2023  润新知