删除字符串中的子串 PAT

来源:互联网 发布:mirna引物设计软件 编辑:程序博客网 时间:2024/05/19 17:48

原题如下:

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

输入格式:

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

输出格式:

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

输入样例:

Tomcat is a male ccatatcat

输出样例:

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

#include <stdio.h>#include <string.h>#define MAX 80int 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 80void 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 80int 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;elsetemp++;}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;elsestr.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++这个代码外,其他三个代码真心不知道错在哪里了。。。哪位大神可以赐教一下,跪谢!


0 0