//子串的定位操作通常称作串的模式匹配(子串称为模式串)
/*
算法一:在主串S中取从第i(i的初值为pos)个字符起、长度和串T相等的子串和串T比
较,若相等,则求得函数值为i,否则i值增1直至串S中不存在和串T相等的子串为止。
*/
int Index(String S, String T, int pos)
{
if(pos > 0)
{
n = StrLength(S);
m = StrLength(T);
i = pos;
while(i < n-m+1)
{
SubString(sub, S, i, m);
if(StrCompare(sub, T) != 0)
++i;
else
return i;
}
}
return 0;
}
/*
算法二:不依赖其他串匹配函数的算法。从主串S的第pos个字符起和模式串的第一个字符比较,若相等,则继续
逐个比较后续字符;否则从主串的下一个字符起再重新和模式串比较,以此类推,直至匹配成功,否则返回0
*/
int Index(String S, String T, int pos)
//返回子串T在主串S中第pos个字符后的位置。若不存在,则返回0,其中T非空,1<=pos<=StrLength(S)
{
int i = 0;
int j = 1;
//计数指针i,j指示主串S和模式串T中当前正在比较的字符位置
while(i <= S[0] && j<= T[0])
{
if(S[i] == T[j])
{
++i;++j;
}
else
{
i = i-j+2;
j=1;
//这里i-j始终不变,+2可看做: +1(相当于加j) +1(每次i自增加1)
}
}
if(j > T[0])
return i-T[0];
else
return 0;
}
/*
算法三:KMP算法--相对于算法二,每一趟匹配过程中,出现字符不匹配时,不需回溯i指针,而是利用已得到的
“部分匹配”的匹配结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较,每次滑动的距离有next数组
取得,因此需要知道匹配过程中产生失配时模式向右滑行的距离多远
PS:算法实现过程比较繁杂,这里我就不一一列出了哈,给出以下源码:
*/
int Index_KMP(SString S, SString T, int pos)
{
//利用模式串T的next函数求T在主串S中第pos个字符后的位置的KMP算法
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>T[0])
{
return i-T[0];
}
else
{
return 0;
}
}
void Get_nextval(SString T, int nextval[])
{
//将模式串T的next函数修正值并存入数组nextval
i=1;
nextval[1]=0;
j=0;
while(i<T[0])
{
if(j==0||S[i]==T[j])
{
++i;++j;
if(T[i]!=T[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
{
j=nextval[j];
}
}
}
字符串模式匹配
最新推荐文章于 2024-02-24 17:11:15 发布