第1关:BF算法
/***字符串匹配算法***/
#include<cstring>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
int i;
if (strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return OK;
}
}
//算法4.1 BF算法
int Index(SString S, SString T, int pos)
{
//返回模式T在主串S中第pos个字符起第一次出现的位置。若不存在,则返回值为0
//其中,T非空,1≤pos≤StrLength(S)
/***********Begin***************/
int lens = 1;
while(S[lens] >= 'A' && S[lens] <= 'Z' || S[lens] >= '0' && S[lens] <= '9')
lens ++ ;
int lent = 1;
while(T[lent] >= 'A' && T[lent] <= 'Z' || T[lent] >= '0' && T[lent] <= '9')
lent ++ ;
int i = pos,j = 1;
while(i < lens && j < lent)
{
if(S[i] == T[j]) i ++ ,j ++ ;
else i = i - j + 2,j = 1;
}
if(j == lent) return i - lent + 1;
else return 0;
/***************End****************/
}//Index
int main()
{
SString S;
char s[MAXSTRLEN];
cin>>s;
StrAssign(S,s) ;
SString T;
char t[MAXSTRLEN];
cin>>t;
StrAssign(T,t) ;
int n=Index(S,T,1);
if(n)
cout<<"主串和子串在第"<<n<<"个字符处首次匹配\n";
else
cout<<"主串和子串没有匹配上\n";
return 0;
}
第2关:KMP算法和next函数值
/***字符串匹配算法***/
#include<cstring>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
int i;
if (strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return OK;
}
}
//算法4.3 计算next函数值
void get_next(SString T, int next[])
{ //求模式串T的next函数值并存入数组next
/**********************Begin**********************/
int i = 1,j = 0;
next[1] = 0;
int k = 1;
while(T[k] >= 'A' && T[k] <= 'Z' || T[k] >= '0' && T[k] <= '9') k ++ ;
k -- ;
while(i < k)
{
if(j == 0 || T[i] == T[j]) i ++ ,j ++ ,next[i] = j;
else j = next[j];
}
/**********************End*************************/
}//get_next
//算法4.2 KMP算法
int Index_KMP(SString S, SString T, int pos, int next[])
{ // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法
//其中,T非空,1≤pos≤StrLength(S)
/**********************Begin**********************/
int a = 1;
while(S[a] >= 'A' && S[a] <= 'Z' || S[a] >= '0' && S[a] <= '9') a ++ ;
a -- ;
int b = 1;
while(T[b] >= 'A' && T[b] <= 'Z' || T[b] >= '0' && T[b] <= '9') b ++ ;
b -- ;
int i = pos,j = 1;
while(i <= a && j <= b)
{
if(j == 0 || S[i] == T[j]) i ++ ,j ++ ;
else j = next[j];
}
if(j > b) return i - b;
else return 0;
/**********************End*************************/
}//Index_KMP
int main()
{
SString S;
char s[MAXSTRLEN];
cin>>s;
StrAssign(S,s) ;
SString T;
char t[MAXSTRLEN];
cin>>t;
StrAssign(T,t) ;
int *p = new int[T[0]+1]; // 生成T的next数组
get_next(T,p);
int n=Index_KMP(S,T,1,p);
if(n)
cout<<"主串和子串在第"<<n<<"个字符处首次匹配\n";
else
cout<<"主串和子串没有匹配上\n";
return 0;
}
第3关:next函数修正值
/***字符串匹配算法***/
#include<cstring>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
int i;
if (strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return OK;
}
}
//算法4.4 计算next函数修正值
void get_nextval(SString T, int nextval[])
{ //求模式串T的next函数值并存入数组nextval
/**********************Begin**********************/
int i = 1,j = 0;
nextval[1] = 0;
int k = 1;
while(T[k] >= 'A' && T[k] <= 'Z' || T[k] >= '0' && T[k] <= '9') k ++ ;
k -- ;
while(i < k)
{
if(j == 0 || T[i] == T[j])
{
i ++ ,j ++ ;
if(T[i] != T[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
/**********************End*************************/
}//get_nextval
//算法4.2 KMP算法
int Index_KMP(SString S, SString T, int pos, int next[])
{ // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法
//其中,T非空,1≤pos≤StrLength(S)
/**********************Begin**********************/
int a = 1;
while(S[a] >= 'A' && S[a] <= 'Z' || S[a] >= '0' && S[a] <= '9') a ++ ;
a -- ;
int b = 1;
while(T[b] >= 'A' && T[b] <= 'Z' || T[b] >= '0' && T[b] <= '9') b ++ ;
b -- ;
int i = pos,j = 1;
while(i <= a && j <= b)
{
if(j == 0 || S[i] == T[j]) i ++ ,j ++ ;
else j = next[j];
}
if(j > b) return i - b;
else return 0;
/**********************End*************************/
}//Index_KMP
int main()
{
SString S;
char s[MAXSTRLEN];
cin>>s;
StrAssign(S,s) ;
SString T;
char t[MAXSTRLEN];
cin>>t;
StrAssign(T,t) ;
int *p = new int[T[0]+1]; // 生成T的next数组
get_nextval(T,p);
int n=Index_KMP(S,T,1,p);
if(n)
cout<<"主串和子串在第"<<n<<"个字符处首次匹配\n";
else
cout<<"主串和子串没有匹配上\n";
return 0;
}