PTA 7-29 删除字符串中的子串 (20 分)-嵌套字串怎么办啊?

综述:

        本题删除字串的情况也挺多的,一个比较难一点的地方就是嵌套的字串部分,如例子中的ccatat,当你删除了中间的cat之后,你会发现又出现了cat,这其实还是挺麻烦的,意味着你不仅仅只遍历一遍字符串,你要遍历好几遍,直至字符串中没有字串的存在。


目录

综述:

题目: 

输入格式:

输出格式: 

输入样例: 

输出样例: 

解题思路:

程序设计:

实现代码:

提交结果: 

结论: 


题目: 

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式: 

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例: 

Tomcat is a male ccatat
cat

输出样例: 

Tom is a male 


解题思路:

        题目要求删除S1中出现的S2子串,删除的第一步是需要找到这个子串,找到后再进行删除,具体过程如下图:

PTA 7-29 删除字符串中的子串 (20 分)-嵌套字串怎么办啊?_第1张图片

程序设计:

大致过程以及逻辑确定后就是具体的程序设计部分了,该程序实现主要注意以下几个点:

1、存放字符串的数组,设置成81个,最后一个可以存 '\0',否则测试用例给一个80个长度的字符串就错掉了。

2、怎么算找到字符串了呢?首先要知道S2有几个字符,假设为n个,当前遍历S1的元素与S2开头的元素相等,进入循环继续判断,然后看看子串S2与S1有几个相同字符

3、子串的判定有一个注意事项,我标记在代码的注意点2,容易搞错,就是判断相同不要把 '\0'判断进去。

4、如果第二部的相同字符正好等于n 说明找到了子串,接下啦就是如何进行删除了,当前 i位置标志着与S2相同的第一个字符,只需要将i+n的元素移动覆盖掉i处的元素,这个过程直到a1[i+n]=='\0'  截止。

5、删除一个子串之后不代表S1中没有子串了,删除完成我把i置成-1,因为在大的while循环的最下面有个i++,这样可以保证下次的循环从0开始,这是注意点3。

6、如果i 走到了S1的'\0' 位置,说明循环已经结束,S1中也没有子串了。

实现代码:

#include 
#include 
int main()
{
	char a1[81]; //注意点1
	char a2[81];
	gets(a1);
	gets(a2);
	int i = 0;
	int k = 0;
	int n = 0;
	while (a2[k] != '\0')
	{
		n++;
		k++;
	}
	k = 0;

	while (a1[i]!='\0')
	{
		
		if (a1[i] == a2[k])
		{
			int j = i;
			while ((a1[j] == a2[k])&&(a2[k]!='\0'))//注意点2
			{
				j++;
				k++;
            }
		}
		if (k == n)
		{
			while (1)
			{
				a1[i] = a1[i + n];
				if (a1[i + n] == '\0')
					break;
				i++;
			}
			
			i = -1;//注意点3
		}
		k = 0;
		i++;
	}
	puts(a1);
	return 0;
}

提交结果: 

PTA 7-29 删除字符串中的子串 (20 分)-嵌套字串怎么办啊?_第2张图片


结论: 

        我觉的这道题是C语言基础练习题中比较好的一道题,比较能练习基础的逻辑编码能力,难度也不难,但是也挺考验基本功,挺好的一道题!

你可能感兴趣的:(PTA刷题,编程语言,c语言)