旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出
肯定坏掉的那些键。
输入描述:
输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、 以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。
输出描述:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。
示例1
输入
7_This_is_a_test _hs_s_a_es
输出
7TI
一开始的想法就是依次比较字符串1与字符串2,找出没有的字符。。。。。有一个测试点未通过
#include<bits/stdc++.h>
using namespace std;
set<char>st;
const int N=1000;
char ch[N];
int main(){
string a,b;
cin>>a>>b;
int i,j,k;
for(i=0,j=0,k=0;j<b.size();){
if(a[i]==b[j]){
i++;
j++;
continue;
}else{
if(!st.count(toupper(a[i]))){
k++;
ch[k]=toupper(a[i]);
st.insert(ch[k]);
}
i++;
}
}
if(i<a.size()-1){
for(;i<a.size();i++){
if(!st.count(toupper(a[i]))){
k++;
ch[k]=toupper(a[i]);
st.insert(ch[k]);
}
}
}
for(int p=1;p<=k;p++){
printf("%c",ch[p]);
}
return 0;
}
于是看了大佬的解法,自己真的菜,只需要找到第一个字符串中的字符未在第二个字符中出现即可
两种方法进行散列,数组和set集合
数组方法如下:
#include<bits/stdc++.h>
using namespace std;
bool hashx[150];
int main(){
string a,b;
cin>>a>>b;
memset(hashx,0,sizeof(hashx));
for(int i=0;i<b.size();i++){
hashx[toupper(b[i])]=1;
}
for(int i=0;i<a.size();i++){
if(!hashx[toupper(a[i])]){
printf("%c",toupper(a[i]));
hashx[toupper(a[i])]=1;
}
}
return 0;
}
set方法如下
#include<bits/stdc++.h>
using namespace std;
unordered_set<char>st;
int main(){
string a,b;
cin>>a>>b;
for(int i=0;i<b.size();i++){
st.insert(toupper(b[i]));
}
for(int i=0;i<a.size();i++){
if(!st.count(toupper(a[i]))){
printf("%c",toupper(a[i]));
st.insert(toupper(a[i]));
}
}
return 0;
}