问题链接
和上一题很一样,但是有不同
上一题是把 文章中的所有出现过的单词 变成小写,字典序输出,重复的只用输出一次
这样用 set 就很方便,直接把单词变成小写 insert 入 set ,就行了
这一题:
只 把文章中的 所有出现过一次的单词 字典序输出,输出的时候保留原大小写,
并且字母相同但是顺序大小写不同的单词算是同一个单词
比如 abc 和 CBA 是同一个单词。
输入以 # 结束。
Sample Input
ladder came tape soon leader acme RIDE lone Dreis peat ScAlE orb eye Rides dealer NotE derail LaCeS drIed noel dire Disk mace Rob dries #
Sample Output
Disk
NotE
derail
drIed
eye
ladder
soon
分析:
麻烦的就是 同样的字母 不同的排序也算是同一个单词
注意是、只输出出现一次的
一
也可以用 set
开两个 set ,一记录不重复的,二记录重复的,一个存不重复的,一个存重复的,但都是小写且是字典序的单词
把原单词全部存到 vector 中,
输出的时候遍历vec中的每个单词,并处理,如果在第一个set中,就输出元单词
二
用 map 更方便一点,map <string, int> ;
first 记录单词,second 记录单词出现的次数,
其他的思想和思路一一样
下面是用 map 的代码
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cstring>
using namespace std;
vector<string> v;
map<string,int> q;
int main()
{
string s;
while(cin >> s)
{
if(s == "#")
break;
else
{
v.push_back(s);
int l = s.size();
for(int i = 0; i < l; i++)
{
if(s[i] >= 65 && s[i] <= 90)
{
s[i] += 32;
}
}
sort(s.begin(),s.end());
q[s]++;
}
}
int n = v.size();
sort(v.begin(),v.end());
string t;
for(int i = 0;i < n; i++)
{
t = v[i];
int len = t.size();
for(int i = 0; i < len; i++)
{
if(t[i] >= 65 && t[i] <= 90)
{
t[i] += 32;
}
}
sort(t.begin(),t.end());
if(q[t]==1)
cout << v[i] << endl;
}
return 0;
}