数据结构·练习·字符串的子串替换
一、问题描述
把一段字符串(主串A)中的某一段子串(B)替换成指定字符串(C)。
二、算法概述
1、问题分析
1)寻找子串
2)替换子串
2、算法描述
-
头文件引用
-
主函数程序:
1.定义变量获取输入数据(主串A和子串B以及替入子串C),并为之分配空间;
2.遍历主串,每匹配成功一个字符便累计,当出现匹配错误时便清零累计;
3.每当栈长等于B串长便清零累计,替换次数加一,将主串A对应位置替换成C的中对应的字符
4.以此类推,遍历完全.
三、输入说明
分三行输入主串A和替出子串B以及替入子串C。
四、输出说明
如果替换成功,输出替换次数和替换后的主串;
如果替出子串B不存在,输出“未找到替代对象”。
输入样例1:
Go ahead, no matter what the result is, just try, feel and hug your life.
your
the
输出样例1:
1
Go ahead, no matter what the result is, just try, feel and hug the life.
输入样例2:
我们和你们都是人类,我们来自中国,你们来自美国,但这并不能否定彼此是命运共同体。
你们
他们
输出样例2:
2
我们和他们都是人类,我们来自中国,他们来自美国,但这并不能否定彼此是命运共同体。
五、程序实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 100
/*主函数*/
int main()
{
/*定义变量*/
int i,j=0,k,l,m;//i是A大主循环数,j是B寻找从循环数,k是C替入主循环数,l是A接收从循环数,m是A移位主循环数
int num=0;//替换次数
int LA,LB,LC;//串长
int d;
char A[M],B[M],C[M];
/*输入数据,分配空间*/
gets(A);
gets(B);
gets(C);
LA=strlen(A);
LB=strlen(B);
LC=strlen(C);
if(LA<LB||LA<LC||LB==0||LC==0)
{
printf("输入非法\n");
return 0;
}
/*大循环用于寻找首字符*/
for(i=0;i<=LA-LB;i++)
{
/*完全匹配时*/
if(j==LB-1&&A[i]==B[j])//替换次数加一,进行替换 ,其中(A[i-LB+1],A[i])与LA要更新
{
l=i-LB+1;//回到首字符位置,进行替换操作
/*主串A移位处理*/
if(LB<LC)//主串加长,i要更新
{
d=LC-LB;
for(m=LA-1;m>i;m--)//后面元素后移d位
{
A[m+d]=A[m];
}
i=i+d;
LA=LA+d;
}
if(LB>LC)//主串减短 , i要更新
{
d=LB-LC;
for(m=i+1;m<LA+d;m++)//后面元素前移d位
{
A[m-d]=A[m];
}
i=i-d;
LA=LA-d;
}
/*进行替换*/
for(k=0;k<LC;k++)
{
A[l]=C[k];
l++;
}
num++;
j=0;//替换完成后,清零累计
}
/*每匹配一个字符,累计*/
else if(A[i]==B[j])
{
j++;
}
/*当匹配错误时,清零累计*/
else
{
j=0;
continue;
}
}
/*输出*/
if(num==0)
{
printf("未找到替代对象\n");
}
else
{
printf("%d\n",num);
puts(A);
}
return 0;
}
六、运行结果
样例1
样例2
七、实践总结
1、认知归纳
更适合的方法才是更好的方法。当对内存没有严格要求时,采用数组(顺序表)更简单。
2、实践问题
1)算法的迭代
在编写程序的过程中,发现存在可以优化的地方,于是反过来优化了算法,调整了代码。
2)可读性的增强
当算法较复杂,变量较多时,程序的可读性就很重要。忽然发现,编写代码的注释,不仅是给他人看的,更是给编写者自己看的。编写注释本质上是编写者梳理算法的过程。