删除字符串中的子串 PAT

原题如下:

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

输入格式:

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

输出格式:

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

输入样例:

Tomcat is a male ccatat
cat

输出样例:

Tom is a male
本来以为是很简单的一道题,随手就写了while循环,代码如下:

#include 
#include 
#define MAX 80
int main()
{
	int i, len;
	char *p, str1[MAX], str2[MAX];
	gets_s(str1);
	gets_s(str2);
	while (strstr(str1, str2) != NULL)
	{
		p = strstr(str1, str2);
		len = strlen(str2);
		while (*(p + len) != '\0')
		{
			*p = *(p + len);
			p++;
		}
		*p = '\0';
	}
	puts(str1);
	return 0;
}

运行结果:

删除字符串中的子串 PAT_第1张图片

又出现了运行超时现象,真心希望PAT能够把测试用例给写明了,到底是什么情况导致了运行超时?于是想到了之前博客中写到的关于while和递归运行效率比较的问题,决定用递归试一下,代码如下:

#include 
#include 
#define MAX 80
void SubStringCancle(char str1[], char str2[])
{
	int len;
	char *p;
	if (strstr(str1, str2) == NULL)
	{
		puts(str1);
		return;
	}
	else
	{
		len = strlen(str2);
		p = strstr(str1, str2);
		while (*(p + len) != '\0')
		{
			*p = *(p + len);
			p++;
		}
		*p = '\0';
		SubStringCancle(str1, str2);
	}
}
int main()
{
	char str1[MAX], str2[MAX];
	gets_s(str1);
	gets_s(str2);
	SubStringCancle(str1, str2);
	return 0;
}
得到的结果仍旧是运行超时,于是晕菜了,到底是什么原因呢?望各位大虾们赐教啊~~~~~~~

还尝试了其他的方法,代码如下:

#include 
#include 
#define MAX 80
int main()
{
	int i, j, k, t, temp, len1, len2;
	char str1[MAX], str2[MAX];
	gets_s(str1);
	gets_s(str2);
	len1 = strlen(str1);
	len2 = strlen(str2);
	for (i = 0; i < len1 / len2; i++)//循环次数
	{
		k = 0;
		for (j = 0; j < len1; j++)
		{
			if (str1[j] == str2[k])//找到首字母相同的位置,然后依次比较后面几个字符,如果有不相同的,则继续向下找
			{
				temp = j;
				for (k = 0; k < len2; k++)
				{
					if (str1[temp] != str2[k])
						break;
					else
						temp++;
				}
				if (k == len2)//说明str2是str1的子串,进行移位操作
				{
					for (t = j; str1[t + len2]; t++)
						str1[t] = str1[t + len2];
					str1[t] = '\0';
					j--;
				}
				k = 0;
			}
		}
		if (!strstr(str1, str2))
			break;
	}
	puts(str1);
	return 0;
}

运行结果:

删除字符串中的子串 PAT_第2张图片

天啊,又有格式错误和答案错误,博主真的是彻底疯了,什么鬼啊?!在VS上运行都是对的呀~

于是乎,决定用C++现有的函数find和erase来进行过程处理了,代码如下:

#include 
#include 
using namespace std;
void DeleteSub(string &str, const string &sub, int n)
{
	int m, flg = 0;
	while (flg == 0)
	{
		m = str.find(sub);
		if (m < 0)
			return;
		else
			str.erase(m, n);
	}
}
int main()
{
	string str, sub;
	getline(cin, str);
	getline(cin, sub);
	int n = sub.size();
	DeleteSub(str, sub, n);
	cout << str << endl;
	return 0;
}

运行结果:

删除字符串中的子串 PAT_第3张图片

苍天啊,大地啊,这到底是为什么?一样的处理过程,这么差距就这么大呢?除了C++这个代码外,其他三个代码真心不知道错在哪里了。。。哪位大神可以赐教一下,跪谢!


你可能感兴趣的:(删除字符串中的子串 PAT)