题目源自PTA:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _
(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
首先来理一下思路:
方法一:用两个字符串来存储原本的内容(string str)和实际的内容(string st),然后用循环来判断str[i] 能否匹配到st[j];
确实可以解决,但问题是两个循环套下来时间复杂度就会很高。因此在参考一些文章后,得到了方法二。
方法二:
原本串的长度是要比实际串的长度要长的,因此我们只用对原本字符串(str)做一次遍历即可,匹配的问题可以用find()函数解决,大小写的问题可以用toupper()函数
使用这两个函数时需要加 #include <ctype.h>
int toupper(int c) //C 库函数 int toupper(int c) 把小写字母转换为大写字母。
- c -- 这是要被转换为大写的字母。
- 返回值:如果 c 有相对应的大写字母,则该函数返回 c 的大写字母,否则 c 保持不变。返回值是一个可被隐式转换为 char 类型的 int 值。
find() //find()函数的妙用就不做过多介绍了
找到就返回第一个的索引值,找不到就返回string::npos
这里直接看代码:
//旧键盘
#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main(){
string str;
string st;
//char ans[90],index=0;
getline(cin,str);
getline(cin,st);
string ans;
for(int i=0;i<str.size();i++){
if(st.find(str[i])==string::npos&&ans.find(toupper(str[i]))==string::npos){
ans+=toupper(str[i]); //保证存入的结果为大写字母
}
}
cout<<ans;
cout<<endl;
return 0;
}