昨天的是关于串的三种存储方式及基于堆分配存储的一些基本操作,由于串的操作很重要,串的模式匹配也是很重要的操作之一,下面简单介绍下其算法:
一、一般算法(低效)
下面是基于串的堆分配存储实现的,效率比较低的串模式匹配算法。
//基于串的对分配存储表示的模式匹配算法
int Index(HString &S, HString &T, int pos)
{
//返回串T在主串S中第pos个字符后的位置,若不存在,返回0
//其中,T非空,且1<=pos<=S.length
int i, j;
i = pos;
j = 0;
while(i <= S.length && j < T.length)
{
if(S->ch[i-1] == T->ch[j]) { ++i, ++j;} //比较后续字符
else {i = i-j+1; j = 0;} //指针回退重新比较
}
if( j = T->length) return i - T.length;
else return 0;
}//Index
二、KMS算法(高效)
//基于串的定长顺序存储表示的KMS算法及其辅助数组next的求解
void get_next(SString T, int next[])
{
//求模式串的next函数值,存入数组next
int i, j;
while(i < T[0])
{
if(j == 0 || T[i] == T[j]) { ++i; ++j; next[i] = j;}
else j = next[j];
}
}//get_next
int Index_KMS(SString S, SString T, int pos)
{
int i, j;
while(i <= S[0] && j <= T[0])
{
if(j == 0 || S[i] == T[j] ) { ++i; ++j;}
else return 0;
}
if(j > T[0] ) return i - T[0];
else return 0;
}//Index_KMS
算法还算容易理解,面临考试,这是笔记吧,随便记录下。