一、题目
本题要求你计算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!
二、方法1:手动实现
1、思路
看到这个题,我们常规思路就是分别遍历两个字符串,分别比较 b 中每一个字符在 a 中是否存在,如果存在则删除,最后输出 a。
这个代码是理论上成立的,但是当数据过大时,会出现栈溢出的情况,所以导致无法通过。
易错点提示:
要注意gets函数和scanf函数的区别:
- gets可以接收空格;
- scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。
2、代码
#include<stdio.h>
int main()
{
char a[10005];
char b[10005];
gets(a);
gets(b);
int i, j, k=0;
for (i = 0; b[i] != '\0'; i++)
{
for (j = 0; a[j] != '\0'; j++) {
if (a[j] != b[i]) {
a[k++] = a[j];
}
}
a[k] = '\0';
}
printf("%s\n", a);
return 0;
}
三、方法2:strchr函数
1、思路
基于方法1,我们可以通过 strchr 函数进行优化。
char *strchr(const char *string, int c);
查找字符串string中字符c首次出现的位置, NULL结束符也包含在查找中. 返回一个指针, 指向字符c在字符串string中首次出现的位置,
如果没有找到, 则返回NULL。
有了 strchr 函数我们就可以有一种新的思路,我们遍历一次字符串a,只需要判断 a 中每一个字符是否存在于 b 中即可,如果存在就跳过,不存在就打印。
2、代码
#include<stdio.h>
#include<string.h>
int main(){
char a[100000],b[100000];
gets(a);
gets(b);
for(int i=0;i<strlen(a);i++)
{
if(strchr(b,a[i]))
continue;
else
printf("%c",a[i]);
}
return 0;
}
三、方法3:标记法
1、思路
方法2的思路又给我们提供了一点启发,我们只需要判断 a 中字符是否在 b 中存在,如果存在就跳过,不存在就打印。我们可以用一个数组来标记 b 中字符,然后只需要判断 a 中字符是否被标记,如果标记就跳过,未标记就打印。
2、代码
#include<stdio.h>
#include<string.h>
int main(){
char a[10005];
char b[10005];
gets(a);
gets(b);
int t[256];
for(int i=0;i<strlen(b);i++){
t[b[i]] = 1;
}
for(int i=0;i<strlen(a);i++){
if(t[a[i]]==0){
printf("%c",a[i]);
}
}
}