模式匹配问题,首先得保证主字符串中不出现子串重叠问题(如:在abcabcabd中找abcab),否则该问题便有二义性。在这个前提下,用字符数组实现比较简单。
字符数组的末尾都添加了'\0'字符,以下是c代码:
int stringconvet(char s[],char t[],char r[])
{
int mainlen=strlen(s),sublen=strlen(t);
int memory[M];//M足够大
int i=0,times=0;
while(s[i])//搜索整个主字符串直至遇到'\0'
{
int j=0;
while(j<m&&t[j]==s[i+j])
{
j++;
if(j==sublen) memory[times++]=i;//保存子串的第一个字符在主串中出现的位置
}
i++;
}
if(times==0)
return 0;//主串中没有对应的子串
//下面实现替换操作
int convertlen=strlen(r);
int interval=convertlen-sublen;//子串和替换串的长度差
for(i=0;i<times;i++)
{
j=i;
int pos=memory[i];
//move函数实现主串中子串位置后的字符串的移动,起到保护原串的作用,interval的正负决定移动方向,大小决定移动位数,interval=0时不移动。
//该函数不是很难,自己实现吧。
move(pos+m,interval);
if(j<times)
memory[++j]+=interval;
for(int m=0;m<convertlen;m++)
{
s[pos++]=r[m];
}
}
return times;//子串在主串中出现的次数
}