输入一些单词,找出所有满足下列条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。
考虑那些能够通过重排得到输入中的其他单词的单词,把它们内部的字符都转成小写再进行排序后得到的结果肯定都是一样的,那么就可以通过map来存储这些“标准化”后的字符串的出现次数,只出现一次的就是正确答案。
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
// 对字符串str进行“标准化”
// 字符转成小写再对字符排序
string conv(const string& str) {
string re = str;
for (int i = 0; i < re.length(); i++) {
re[i] = tolower(re[i]);
}
sort(re.begin(), re.end());
return re;
}
int main() {
vector<string> words;
map<string, int> cnt;
string word;
while (cin >> word) {
if (word == "#") break;
words.push_back(word);
string conv_str = conv(word);
if (!cnt.count(conv_str)) cnt[conv_str] = 0;
cnt[conv_str]++;
}
vector<string> ans;
for (int i = 0; i < words.size(); i++) {
if (cnt[conv(words[i])] == 1)
ans.push_back(words[i]);
}
sort(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << endl;
}
return 0;
}
需要注意的几点是
tolower(s[i])这个全局函数不会改变s[i]的值,因此需要把返回值赋回给s[i]
re[i] = tolower(re[i]);
string内部的字符也是可以排序的,写法同vector
sort(re.begin(), re.end());
map的count函数是返回key出现的次数,在map里,key只能是0和1
例如 我们判断一个key是否存在,如果存在就输出,不存在就不输出