By Jalan
知识工具需求
数学
nope
数据结构和算法
- hash散列
语言
- 在cpp中可以自定义自己的扫描集合,%[abcz],%[a-z],%[ ^ a],%[ ^ \n]等.^代表取反集,可以使用如:
scanf("%[^\n]",s1); getchar();
来输入一个以换行为结尾的字符串(可以包含除了换行之外的任意字符).但是注意用非集扫描的时候,比如[ ^ a]这时扫描会录入a之前的字符,a会被留在输入缓冲区里(如果后面需要输入别的可能需要一个getchar()
)去掉它. - stelen(s)的长度不包含字符串结尾的’\0’;
题干
给两个字符串S1,S2,S=S1-S2的定义是移除所有S1里在S2中出现过的字符,你需要处理这个过程,要快,
输入条件
两行,每行分别是S1S2,串长不会超过10^4,保证所有字符都是ASCII字符,换行符标志串尾.
输出条件
输出S1-S2.
题解
第一次
思路
ASCII就256个,用hash散列统计S2,打印时候对S1每个字符进行判断
预期时间复杂度
n
编写用时
8分钟
代码
CPP
#include <cstdio>
#include <stdio.h>
#include <cstring>
#include <string.h>
using namespace std;
int main(int argc, char const *argv[])
{
char *s1=new char[10001];
char *s2 = new char[10001];
scanf("%[^\n]",s1);
getchar();
scanf("%[^\n]", s2);
int scan[256]={0};
for (int i = 0; i < strlen(s2); i++)
{
if (s2[i]=='\0')
{
break;
}
scan[(int)s2[i]]++;
}
for (int i = 0; i < strlen(s1); i++)
{
if (!scan[(int)s1[i]])
{
printf("%c",s1[i]);
}
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@