反片语(UVa156)

  题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page=show_problem&problem=92

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 }

猜你喜欢

转载自www.cnblogs.com/pgzhang/p/9270039.html