一个FLAG #12# 反片语

例题5-3 反片语(Ananagrams, UVa 156)完整题目见参考[1]

思路:首先把未标准化的单词逐个存到一个vector中,在存的过程中,将标准化后的单词,例如RIDE标准化后是deir,通过map存储并统计其出现的次数。然后根据map中所存储的信息进一步从第一个vector中筛选出符合条件的答案,存储到另外一个vector中,最后排序,输出。

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

map<string, int> cnt;
vector<string> words;

// 将单词标准化 
string repr(const string &s)
{
    string ans = s;
    for (int i = 0; i != ans.length(); ++i) {
        ans[i] = tolower(ans[i]);
    }
    sort(ans.begin(), ans.end()); 
    return ans;
}

int main()
{
    int n = 0;
    string s;
    while (cin >> s) {
        if (s[0] == '#') break;
        words.push_back(s);
        string r = repr(s);
        if (!cnt.count(r)) cnt[r] = 0;
        cnt[r]++;
    }
    
    vector<string> ans;
    for (int i = 0; i != words.size(); ++i) {
        if (cnt[repr(words[i])] == 1) ans.push_back(words[i]);
    }
    sort(ans.begin(), ans.end());
    for (int i = 0; i != ans.size(); ++i) {
        cout << ans[i] << "
";
    }
    return 0;
}

参考

[1] 反片语(map) - Not-Bad - 博客园

[2] c++ stl 关于map的find和count的使用 - sugarbliss - CSDN博客

[3] STL教程:C++ STL快速入门(非常详细)

原文地址:https://www.cnblogs.com/xkxf/p/12671847.html