数据结构 KMP 串的模式匹配 (25 分)

Posted keiiha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 KMP 串的模式匹配 (25 分)相关的知识,希望对你有一定的参考价值。

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

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

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 105​​,Pattern 长度为 10;
  • 数据2:随机数据,String 长度为 105​​,Pattern 长度为 102​​;
  • 数据3:随机数据,String 长度为 105​​,Pattern 长度为 103​​;
  • 数据4:随机数据,String 长度为 105​​,Pattern 长度为 104​​;
  • 数据5:String 长度为 106​​,Pattern 长度为 105​​;测试尾字符不匹配的情形;
  • 数据6:String 长度为 106​​,Pattern 长度为 105​​;测试首字符不匹配的情形。

输入格式:

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

输出格式:

对每个 Pattern,按照题面要求输出匹配结果。

输入样例:

abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
 

输出样例:

abcabcacabxy
Not Found
Not Found

 

超出了string的范围,需要用char* 

测试点5 6 超时 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

void getNext(vector<int> &next,char* pattern){
    int j{0},k{-1};
    next[0]=-1;
    while(j<strlen(pattern)-1){
        if(k==-1||pattern[j]==pattern[k]){
            j++;k++;
            next[j]=k;
        }else{
            k=next[k];
        }
    }
}

int main(){
    int n;
    char str[1000001],pattern[1000001];
    scanf("%s",str);// str;
    int slen=strlen(str);
    cin >> n;
    for(int i=0;i<n;i++){
        scanf("%s",pattern);
        int plen=strlen(pattern);
        vector<int> next(plen);
        getNext(next, pattern);
        int j{0},k{0};
        while(j<slen&&k<plen){
            if(k==-1||str[j]==pattern[k]){
                j++;k++;
            }else{
                k=next[k];
            }
        }
        if(k==plen){
            char *p=&str[j-k];
            cout << p <<endl;
        }else{
            cout << "Not Found" <<endl;
        }
    }
    return 0;
}

 

以上是关于数据结构 KMP 串的模式匹配 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

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

串的模式匹配算法之kmp

数据结构-串的模式匹配

(王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

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

(原创)数据结构之利用KMP算法解决串的模式匹配问题