数据结构·练习·字符串的子串替换

数据结构·练习·字符串的子串替换

一、问题描述

把一段字符串(主串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)可读性的增强
当算法较复杂,变量较多时,程序的可读性就很重要。忽然发现,编写代码的注释,不仅是给他人看的,更是给编写者自己看的。编写注释本质上是编写者梳理算法的过程

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值