原题如下:
输入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 <stdio.h>
#include <string.h>
#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能够把测试用例给写明了,到底是什么情况导致了运行超时?于是想到了之前博客中写到的关于while和递归运行效率比较的问题,决定用递归试一下,代码如下:
#include <stdio.h>
#include <string.h>
#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 <stdio.h>
#include <string.h>
#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;
}
运行结果:
天啊,又有格式错误和答案错误,博主真的是彻底疯了,什么鬼啊?!在VS上运行都是对的呀~
于是乎,决定用C++现有的函数find和erase来进行过程处理了,代码如下:
#include <iostream>
#include <string>
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;
}
运行结果:
苍天啊,大地啊,这到底是为什么?一样的处理过程,这么差距就这么大呢?除了C++这个代码外,其他三个代码真心不知道错在哪里了。。。哪位大神可以赐教一下,跪谢!