KMP:
函数get_nextval(char T[], int nextval[])是计算字符串T的next数组,函数Index_KMP(char S[], char T[], int pos, int next[])是KMP算法。
函数接口定义:
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
其中 T
是模式串,S
是主串,next
是next数组。
裁判测试程序样例:
输入样例:
第一行输入主串,第二行输入模式串:
abdsegdsagddfddfedfgds egdsa
输出样例:
输出子串在主串中第p个位置后首次出现的位序:
5
#include<cstring>
#include<iostream>
using namespace std;
#define MAXSTRLEN 255
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
int main()
{
char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
char S1[MAXSTRLEN],S2[MAXSTRLEN];
cin >> S1 >> S2;
strcpy(&S[1],S1);
strcpy(&T[1],S2);
S[0]=strlen(S1);
T[0]=strlen(S2);
int *next = new int[T[0]+1];
get_nextval(T,next);
cout<<Index_KMP(S,T,1,next);
return 0;
}
/* 请在这里填写答案 */
//书P95
void get_nextval(char T[],int next[])
{
int i=1,j=0;
while(i<T[0]){//T[0]为字符串的长度
next[1]=0;
if(next[i]==next[j]||j==0){
++i;
++j;
next[i]=j;
if(T[i]==T[j])//优化
next[i]=next[j];
else
next[i]=j;
}
else
j=next[j];
}
}
//书P96
int Index_KMP(char S[],char T[],int pos,int next[])
{
int i=pos,j=1;
get_nextval(T,next);
while(i<=S[0]&&j<=T[0]){//反复比较对应字符来开始匹配
if(S[i]==T[j]||j==0){
++i;
++j;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
模式匹配:
给出主串s
和模式串t
,其长度均不超过1000
。本题要求实现一个函数BF(string s, string t)
,求出模式串t
在主串s
中第一次出现的位置(从0
开始计算),如果在s
中找不到t
,则输出-1
。
函数接口定义:
/* s为主串,t为模式串。
* 函数返回t在s中第一次出现的位置。
*/
int BF(string s, string t);
其中 s
和 t
分别为主串和模式串,长度均不超过1000
。函数返回模式串t
在主串s
中第一次出现的位置(从0
开始计算),如果在s
中找不到t
,则输出-1
。
裁判测试程序样例:
#include <bits/stdc++.h>
using namespace std;
/* s为主串,t为模式串。
* 函数返回t在s中第一次出现的位置。
*/
int BF(string s, string t);
int main(int argc, char const *argv[])
{
string s, t;
getline(cin, s); //输入主串
getline(cin, t); //输入模式串
int pos = BF(s, t); //搜索
cout << pos << endl;//输出模式串在主串中第一次出现的位置
return 0;
}
/* 请在这里填写答案 */
输入样例1:
This is a test string
is
输出样例1:
2
输入样例2:
This is a test string
The
输出样例2:
-1
//书P90
int BF(string s,string t)
{
int i=0,j=0,len1=s.length(),len2=t.length();
while(i<len1&&j<len2){//反复比较对应字符来开始匹配
if(s[i]==t[j])
i++;
j++;
else
i=i-j+1;
j=0;
}
if(j>=len2)
return i-len2;
else
return -1;
}