三、串
串是由零个或者多个字符串组成的有限序列,又名叫字符串。
1.模式匹配
int Index(String S, Sting T, int pos){ //返回子串T在主串S中第pos个字符之后的位置
int i=pos; //i用于记录主串S中当前位置的下标,若pos不为1,则从pos位置开始匹配
int j=1; //j用于记录子串T中当前位置的下标
while(i<=S[0]&&j<=T[0]){ //i小于S的长度并且T小于T的长度
if(S[i]=T[i]){ //两字母相等
i++;
j++;
}
else{
i=i-j+2; //i退回上次匹配位置的下一个位置
j=1; //j退回T的首位
}
if(j>T[0]){ //完全匹配
return i-T[0];
}else{
return 0;
}
}
}
2.KMP模式匹配
void get_next(String T, int next[]){ //通过计算返回子串T的next数组
int i=1;
int j=0;
next[1]=0;
while(i<T.length){
if(j==0||T[i]==T[j]){ //T[i]表示后缀的单个字符
i++; //T[j]表示前缀的单个字符
j++;
next[i]=j;
}
j=next[j]; //若字符不相同,则j值回溯
}
}
int Index_KMP(String S, String T, int pos){ //返回子串T在主串S中第pos个字符之后的位置
int i=pos; //i用于记录当前S的位置下标
int j=1; //j用于记录当前T的位置下标
int next[255]; //定义一维数组
get_next(T,next); //分析得到T的next
while(i<=S.length&&j<=T.length){
if(j==0||S[i]==T[j]){ //两字母相同
i++;
j++;
}else{
j=next[j]; //j退回到合适位置,重新匹配
}
}
if(j>T.length){
return i-T.length;
}else{
return 0;
}
}