10 - 2 删除字符串中的子串

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

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

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

输入样例:

1
Tomcat is a male ccatat

输出样例:

1
Tom is a male

自述

这道题,纠结了快整一天了,提交了六七次才对。原来的思路是不断strstr,查找后再不断strcat成新的字符串,循环往复。终于在自己电脑上结果正确了,但提交后就是有测试点不对,还超时了。那就再改改,改完后,超时是没超时了,问题,之前对的测试点有些出错了,到现在我都不知道那些测试点的典型样例是啥,我自己搞得一些样例还是对的啊。改来改去,还是不对。遂参考了 GeYu代码

他的思路与我之前的完全不同,他是通过直接修改input的各个位置的内容,将内容左移的方式来完成删除功能的,思路简洁明了,没有太多的坑。而我之前的就是很难直接看出来了,就用他的思路,结合我自己的一些想法,完成了这个测试。

最新的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "string.h"

char* removestr(char *input,const char *s){
char *tmp;
char *tmp2 = input;
int len = strlen(s);
int i = 0,j = 0;
if (len <= 0) return input;
if (!strstr(input, s))return input;
while ((tmp = strstr(input, s))){
int m = 0;
j = 0;
i = tmp - input;
j = strlen(input) - i - len + 1;
for (m = 0; m < j;m++)
{
tmp2[i + m] = tmp2[i + m + len];
}
}
return input;
}

int main(){
char input[82] = "";
char s[82] = "";
gets(input);
gets(s);
printf("%s", removestr(input, s));
return 0;
}