本题要求你计算A-B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A-B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A-B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
本来是想着直接比较然后删除A里面的元素,结果运行错误,运行超时,还是太天真
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[10000];
char b[10000];
int i, j, k;
gets(a);
gets(b);
for(i = 0; i < strlen(a); i++){
for(j = 0; j < strlen(b); j++){
if(a[i]==b[j] && a[i]!=' ' && b[j]!=' '){
for(k = i; k < strlen(a); k++){
a[k] = a[k+1];
}
}
}
}
for(i = 0; i < strlen(a); i++){
printf("%c",a[i]);
}
return 0;
}
后来在网上看了个算法,增加标志位,减去了删除元素的复杂度,不过在辣么长的字符串面前还是运行超时了
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[10000];
char b[10000];
int flag=1, i, j;
gets(a);
gets(b);
for(i = 0; i < strlen(a); i++){
flag = 1;
for(j = 0; j < strlen(b); j++){
if(a[i]==b[j]){
flag=0;
break;
}
}
if(flag){
printf("%c",a[i]);
}
}
return 0;
}
所以又去百度,这次发现了一个小姐姐,(从昵称看比较像是小姐姐)写的一个贼牛逼的算法,多加了一个数组,借助ASCII的编码来建立一个大小为128的数组,对B字符串来进行存储,第i个字符若为a,则将c的数组下标为a的ASCII值的数置位1,这个算法大大降低了时间复杂度。 硬生生的把平方阶的时间复杂度降到了线性阶,膜拜大神。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[10000];
char b[10000];
int c[128], i;
gets(a);
gets(b);
for(i = 0; i < 128; i++){
c[i]=0;
}
for(i = 0; i < strlen(b); i++){
c[(int)b[i]]=1;
}
for(i = 0; i < strlen(a); i++){
if(c[(int)a[i]]==0){
printf("%c",a[i]);
}
}
return 0;
}
小姐姐博客链接如下:https://www.cnblogs.com/beimengmuxi/p/6561408.html