题目
Description
输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写。满足条件的所有单词按字典序排列。
Input
输入包含若干单词,随机由空格和回车分割。单词由不超过50个大小写字母组成。保证单词数目不超过1e5个。输入以字符‘#’表示结束
Output
输出将由一系列行组成。每一行将由一个单词组成,它是输入字典中的一个满足条件的单词。单词必须按字典序(区分大小写)输出。
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
分析
我们亲爱的蒋队给新生们找的map模板题!
- 逐个输入单个单词,忽略空格和回车,请用cin + string
- 在不分大小写的情况下可以通过字母重排得到彼此的两个单词,他们全部转换为大写(或小写)之后,按字母顺序排序(例如BACK排序后变为ABCK),得到的是同一个字符串(建议停下来多想想!)
- 单词必须按字典序(区分大小写)输出,但使用map就可以让这个容器自动排序,排序规则和题目一样,所以输出时用一个迭代器顺序输出就可以,无需多虑
我们在判断时,要用到某个单词str经过我们处理后的字符串str2,所以我们应该要有一个map来映射一个单词str和它处理后的字符串str2
map <string, string> word;
最后我们输出满足条件的单词str时,它对应的str2应该只出现了一次,因此我们要创建另一个map来映射str2和它出现的次数
map <string, int> cnt;
基本流程也没有什么难的,单词数量不过1e5,不会卡cin,我们可以大胆地用。
- cin 输入单词存入str
- 不是 “#” 继续,如果是跳出
- 对str进行操作输出为str2
- 在word中映射key str的value 为 s
- 在cnt中让key str2 的 value++
- 重复2 - 6
AC代码
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
map <string, int> cnt;
map <string, string> word;
string str;
int main()
{
while(cin >> str)
{
if (str == "#")
{
break;
}
string str2;
str2 = str;
for(int i = 0; i < str.length(); i++)
{
if(str[i] >= 'a' && str[i] <= 'z')
{
str2[i] -= 32;
}
}
sort(str2.begin(), str2.end());
cnt[str2]++;
word[str] = str2;
}
map <string, string>::iterator i;
for(i = word.begin(); i != word.end(); i++)
{
if(cnt[(*i).second] == 1)//注意判断,有一层套娃,多理解一下
{
cout << (*i).first << endl;
}
}
return 0;
}