算法习题---5.4反片语(Uva156)
一:题目
输入一些单词,找出所有满足以下条件的单词:该单词不能通过字母重排得到输入文本中的另外一个单词。在判断是否满足条件时,字母不区分大小写,但在输出时应该保留输入中的大小写,按字典序进行排列
将输入的单词进行“标准化”,即将单词中的每个字母化为小写并按字典序重排单词,用一个字典来统计一个标准化的单词出现过多少次,输出的时候只输出在标准字典中出现一次的那些单词即可。
(一)样例输入
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; }