By
YiHeng
Updated:
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。
输入格式:
输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过 80 个字符的串,由字母 A-Z(包括大、小写)、数字 0-9、以及下划线 _
(代表空格)组成。题目保证 2 个字符串均非空。
输出格式:
按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有 1 个坏键。
输入样例:
7_This_is_a_test
_hs_s_a_es
输出样例:
7TI
步骤:
(1)将完整的字符串s1和缺失的字符串s2中小写的字符都变为大写。
(2)判断s1[i]和s2[j]是否相等。若相等,i++,j++;若不相等,进入步骤(3)
(3)判断当前s1[i]中字符是否存在于集合set1中。若不存在,打印s1[i]并将s1[i]插入集合set1中。无论s1[i]是否存在于集合中,都i++。
(4)判断i是否越了s1的界,若越界,则结束;否则回到步骤(2)。
分析:
i和j分别指向s1和s2当前的下标位置,set1存储缺失的字符。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<iostream> #include<string> #include<set> using namespace std; string Upper(string s){ for (int i=0;i<s.size();i++){ if (s[i] == '_') continue; if (s[i] >= 'a' && s[i] <='z') s[i] -= 32; } return s; } int main() { string s1,s2; set<char> set1; set<char>::iterator it; int i,j; cin >> s1 >> s2; s1 = Upper(s1); s2 = Upper(s2); i=0,j=0; while (i<s1.size()){ if (s1[i] == s2[j]){ i++;j++; } else{ it = set1.find(s1[i]); if (it == set1.end()){ cout << s1[i]; set1.insert(s1[i]); } i++; } } return 0; }
|
改进:
用字符串的find函数直接查找s1中的字符是否能在s2中和缺失字符串ans中查找到,如果在两者中都查找不到,则该字符是需要输出的。string::npos表示在字符串中没有匹配到相应的字符。
1 2 3 4 5 6 7 8 9 10
| #include <iostream> #include <cctype> using namespace std; int main() { string s1, s2, ans; cin >> s1 >> s2; for (int i = 0; i < s1.length(); i++) if (s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos) ans += toupper(s1[i]); cout << ans; return 0; }
|