uva156反片语
作者:互联网
预备知识
字典序排序时大写都比小写小
map<Key类型,value类型>m;//m.count(key)返回值为1或0,表示这个key是否存在于map中。
sort()可以对string数组字典序排序,也可以对string对象进行元素遍历排序。
题目
输入文本,找出如下单词并按字典序输出:单词不能通过字母重排得到文本中的其它单词(不区分大小写)。输出时保留原单词的大小写。
思路及代码
/*1.对输入的单词全部转换为小写,再按照字典序排序。得到标准化后的单词,此时单词不与其他单词严格重复则为有效单词。 * 2.标准化后的单词判断是否严格重复:map<单词,出现次数> * 3.输出原格式的单词:因此必须保留所有原输入单词,输出时遍历原单词数组判断其标准化单词在map中的value是否为1. * 为1则push到输出队列。输出队列升序后即可输出。 */ //原单词数组 vector<string>words; //判断标准化后是否有重复 map<string, int>cnt; //输出要升序输出 vector<string>ans; string repr(const string& s) { string ans = s; for (int i = 0;i < ans.length();i++) ans[i] = tolower(ans[i]); sort(ans.begin(), ans.end());//string对象的成员函数begin()和end() return ans; }; int main() { //处理原单词数组和单词标准化后出现次数 string s; while (cin >> s) { if (s[0] == '#')break; words.push_back(s); string r = repr(s); if (!cnt.count(r))cnt[r] = 0;//把标准化单词放入map ++cnt[r]; }; //判断是否有重复,没有就排序后输出 for (int i = 0;i < words.size();++i) if (cnt[words[i]] == 1)ans.push_back(words[i]); //sort(ans, ans+ans.size()); sort(ans.begin(),ans.end());//vector数组的成员函数begin(),end() for (int i = 0;i < ans.size();++i)cout << ans[i]<<endl; };
标签:输出,string,uva156,标准化,单词,words,ans,片语 来源: https://www.cnblogs.com/xiao-wang-zi/p/13927662.html