一般常规会想到一下方法匹配字符串:
但是这个的时间复杂度为O(M*N)有更好短时间的匹配方法,时间复杂度为O(M+N)这个书上有理论的证明的: 主要是对要去匹配的字符串的部分匹配失败处理回溯指针的位置应该到什么位置最合适,所以把要匹配的字符串进行模式串化:
int StrMatch ( char S [ ], char T [ ], int pos ) {
int i = pos, j = 0;
while ( S[i+j] != '\0'&& T[j] != '\0')
if ( S[i+j] == T[j] ) j ++;
else { i ++; j = 0; }
if ( T[j] == '\0')
return i;
else return -1;
}
但是这个的时间复杂度为O(M*N)有更好短时间的匹配方法,时间复杂度为O(M+N)这个书上有理论的证明的: 主要是对要去匹配的字符串的部分匹配失败处理回溯指针的位置应该到什么位置最合适,所以把要匹配的字符串进行模式串化:
/*
这是一个字符串匹配模式函数
第一个参数为要进行模式化的字符串
第二个参数为模式化整形数组
*/
/*
对于next[]数组的定义如下:
1)next[j]=-1 j=0
2)next[j]=max k:0<k<j P[0...k-1]=P[j-k,j-1]
3)next[j]=0 其他
这里的N就是next数组.
*/
void GetNextVal(char *P,int *N){
int i=0,j=-1;
N[0]=-1;
while(P[i]!='\0'){
if(j==-1 || P[i]==P[j]){
i++;
j++;
if(P[i]!=P[j])
N[i]=j;
else
N[i]=N[j];
}
else
j=N[j];
}
}
void GetNext(char *P,int *N){
int i=0,j=-1;
N[0]=-1;
while(P[i]!='\0'){
if(j==-1 || P[i]==P[j]){
i++;
j++;
N[i]=j;
}
else
j=N[j];
}
}
/
/
/*
字符串默认第一个位置查找函数
第一个参数为父字符串(被查的)
第二个参数为子字符串(要找的)
返回值为找到的位置.
*/
int SearchSubstring(char *T,char *P){//默认从第一个位置开始寻找
int next[100];
int i=0,j=0;
GetNextVal(P,next);
while(i<(int)strlen(T)){
if(j==-1 || T[i]==P[j]){
i++;
j++;
}
else{
j=next[j];
}
if(j==(int)strlen(P)){
return (i-strlen(P)+1);
}
}
return 0;
}
int SearchSubstring(char *T,char *P,int pos=1){//从第pos位置开始寻找
int next[100];
int i,j=0;
if(pos<1){
pos=1;
}
i=pos-1;
GetNextVal(P,next);
while(i<(int)strlen(T)){
if(j==-1 || T[i]==P[j]){
i++;
j++;
}
else{
j=next[j];
}
if(j==(int)strlen(P)){
return (i-strlen(P)+1);
}
}
return 0;
}