紫书—关于例题5-4反片语的思考
题目链接:https://vjudge.net/problem/UVA-156
主要思想:对每个单词进行标准化,标准化:先将每个单词存下来,然后对单词进行排序,排完序后与原来字符串一起存入到map中,之后在开另一个map来记录出现次数.遍历map时只有出现次数为1的才可以被打印出 来.
AC代码展示:
#include<bits/stdc++.h> using namespace std; map<string,string>k; //存放对应关系的映射 map<string,int>p; //记录单词出现次数的数组 vector<string>que; //排序的动态数组 string s; int main(){ while(cin>>s,s!="#"){ string l=s; for(int i=0;i<s.length();i++){ //大写转成小写 s[i]=tolower(s[i]); } sort(s.begin(),s.end()); //排序 p[s]++; k[s]=l; } for(auto i=k.begin();i!=k.end();i++){ // map有排序,但是是按照key来排序的. if(p[i->first]==1){ que.push_back(i->second); } } sort(que.begin(),que.end()); for(int i=0;i<que.size();i++){ cout<<que[i]<<endl; } }
注意事项: map和set都有排序的,但map是按照key来排序的,但答案想让我们用value来排序,故要新建一个动态数组来存放数据进行排序.
错误代码展示: note——当时也是脑子秀逗了,居然好久没看出这个代码有问题.........别再犯这种低级错误啦 {=.=}
#include<bits/stdc++.h> using namespace std; map<string,string>k; string s; int main(){ while(cin>>s,s!="#"){ string l=s; for(int i=0;i<s.length();i++){ s[i]=tolower(s[i]); } sort(s.begin(),s.end()); if(!k.count(s)){ //这种方法迷惑性大 是逻辑有问题 因为你不确定先输入的这个后面是否会再次输入 如果再次输入了则这个就废了 cout<<s<<endl; k[s]=l; } } for(auto i=k.begin();i!=k.end();i++){ cout<<i->second<<endl; } }

浙公网安备 33010602011771号