一:题目
输入一些单词,找出所有满足以下条件的单词:该单词不能通过字母重排得到输入文本中的另外一个单词。在判断是否满足条件时,字母不区分大小写,但在输出时应该保留输入中的大小写,按字典序进行排列
将输入的单词进行“标准化”,即将单词中的每个字母化为小写并按字典序重排单词,用一个字典来统计一个标准化的单词出现过多少次,输出的时候只输出在标准字典中出现一次的那些单词即可。
(一)样例输入
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
#
(二)样例输出
Disk
NotE
derail
drIed
eye
ladder
soon
二:代码实现
#define _CRT_SECURE_NO_WARNINGS
#define _SCL_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
map<string, string> source;
map<string, bool> result;
int main()
{
freopen("data5_4.in", "r", stdin);
freopen("data5_4.out", "w", stdout);
char low_str[21];
string str;
while (true)
{
cin >> str;
if (str == "#")
break;
for (int i = 0; i < str.length()+1; i++)
low_str[i] = tolower(str[i]); //转小写
sort(low_str, low_str + str.length()); //将字符串排序
source.insert(pair<string, string>(str, string(low_str))); //将源字符串,排序字符串 --> 插入map中
auto pi = result.find(string(low_str)); //查找排序字符串是否在result映射中
if (pi == result.end())
result.insert(pair<string, bool>(string(low_str), true)); //如果是第一次出现,则设置为true
else
pi->second = false; //如果是出现多次,则设置为false
}
//进行遍历处理
for (map<string, string>::iterator iter = source.begin(); iter != source.end();iter++)
{
auto it = result.find(iter->second);
if ((*it).second) //找到所有的 在result映射中只出现过一次的字符串
cout << iter->first << endl; //输出源字符串
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return 0;
}