PTA KMP 串的模式匹配
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。
本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:
输出格式:
对每个 Pattern,按照题面要求输出匹配结果。
输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
结尾无空行
输出样例:
abcabcacabxy
Not Found
Not Found
结尾无空行
Code
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
//3-KMP-BuildMatch
void BuildMatch(string pattern,int match[]){
int m=pattern.size();
int i,j;
match[0]=-1;
for(j=1;j<m;j++){
i=match[j-1];//上一个子串
while(i>=0&&pattern[i+1]!=pattern[j]){//一直回退match,递归找合适的匹配值
i=match[i];
}
//修改match值
if(pattern[i+1]==pattern[j]){
match[j]=i+1;
}else{
match[j]=-1;
}
}
}
//KMP核心算法
int KMP(string str,string pattern){
int n=str.size();
int m=pattern.size();
if(m>n){
return -1;
}
int match[m];
BuildMatch(pattern,match);
int p,s;
p=s=0;
while(p<m&&s<n){
if(pattern[p]==str[s]){
p++;s++;
}else if(p>0){
p=match[p-1]+1;//回退到上一个匹配串的下一个不匹配位置
}else{
s++;
}
}
return (p==m)?(s-m):-1;
}
int main(){
string str,pattern;
cin>>str;
int N,Pos;
scanf("%d",&N);
for(int i=0;i<N;i++){
cin>>pattern;
Pos=KMP(str,pattern);
if(Pos==-1){
printf("Not Found\n");
}else{
for(int j=Pos;j<str.size();j++){
printf("%c",str[j]);
}
printf("\n");
}
}
return 0;
}