算法习题---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;
}

 

posted @ 2019-09-12 16:38  山上有风景  阅读(202)  评论(0编辑  收藏  举报