【每日打卡】Day14:反片语(UVa156) C++实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40184885/article/details/89646860

题目

输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不区分大小写,但在输出的时候保留输入时的大小写,按字典序进行排列。

样例输入

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

 解析与代码

本题考查单词重组,重组问题应采用机器思维,即不考虑大小写、将单词的字母排序,若新生成的字符串唯一,则说明该单词不能重组,若不唯一,则说明可以重组。因此使用map来关联每个单词重后后的新字符串与其唯一性,代码如下:

//
// Created by Dr.W on 2019.4.28.
//
#include <bits/stdc++.h>

using namespace std;
map<string,int> m;  //每个单词的映射,对应映射是个数
vector<string> w;   //单词向量
string nstr(const string &s){
    string ns = s;
    for(int i = 0; i < s.length(); i ++)
        ns[i] = tolower(ns[i]);
    sort(ns.begin(),ns.end());
    return ns;
}
int main(){
    string str;
//    cout << nstr(str);
    while(cin >> str){
        if(str[0] == '#') break;
        w.push_back(str);
        string ns = nstr(str);
        if(!m.count(ns)) m[ns] = 0;
        m[ns] ++;
    }
    //cout << w.size() << endl;
    vector<string> ans;
    for(int i = 0; i < w.size(); i ++){
        string ns = nstr(w[i]);
        if(m[ns] == 1)
            ans.push_back(w[i]);
    }
    sort(ans.begin(),ans.end());
    for(int i = 0; i < w.size(); i ++){
        cout << ans[i] << endl;
    }
    return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页