反片语(UVa156)
1.将输入的单词标准化:单词字母转为小写,再将单词排序
2.将排序后的单词存入map中,当有相同的key时,也即意味着两个单词之间可以通过字母重排互相转化,key对应的value记录重复的数值,值为1即为我们要找的单词
C++11代码如下:
1 #include<iostream> 2 #include<vector> 3 #include<map> 4 #include<cctype> 5 #include<algorithm> 6 #include<string> 7 8 using namespace std; 9 map<string, int>cnt; 10 vector<string>word; 11 string repr(const string&s) { //标准化 12 string ans=s; 13 for (int i = 0; i < s.length(); i++) { 14 ans[i] = tolower(s[i]); 15 } 16 sort(ans.begin(), ans.end()); 17 return ans; 18 } 19 20 int main() { 21 string s; 22 while (cin >> s) { 23 if (s[0] == '#') break; 24 word.push_back(s); 25 string r = repr(s); 26 if (!cnt.count(r)) cnt[r] = 0; //count函数统计map中key出现的次数,为0或1 27 cnt[r]++; 28 } 29 vector<string>ans; 30 for(vector<string>::iterator it=word.begin();it!=word.end();it++) 31 if (cnt[repr(*it)] == 1) ans.push_back(*it); 32 sort(ans.begin(), ans.end()); 33 for (vector<string>::iterator it = ans.begin(); it != ans.end(); it++) 34 cout << *it << endl; 35 return 0; 36 }