[C++ 将重复的单词归并然后按字典顺序排好]

输入若干单词,单词之间的分隔符可以是任意的标点符号或空格。对每个单词,看它的等同单词在所有输入的单词中是否出现过,若没有出现,就输出原单词。所有要输出的单词按字典序顺序输出。

等同单词是指多个单词包含的字符完全相同,如abc、bac、acb是等同单词。
例如:输入数据:abc,wes,fdf,bca . ccd
输出:abc ccd fdf wes

解题思路:

(1)处理输入字符串得到多个单词;
(2)建立一multimap 《string,string》,对每个单词,键为排序后得到的单词(newWord),值为原单词(word);(排序使用算法sort对单词word中的字符排序)
(3)把multimap中newWord出现次数为1的word插入set《string》;
(4)最后输出set即可。

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include<algorithm>
#include<set>

using namespace std;
int main(int argc, char* argv[])
{
    string strText;//源串
    cin >> strText;
    string strSeparator = "  / ,./?:;'!@#&$%^*()_+*/{}[] \ ";      //按符号拆分
    int size_pos = 0;           //拆分子串结束位置
    int size_prev_pos = 0;      //拆分子串起始位置

    vector<string> vectormap;
    set<string> myset;
    typedef vector<string> VECTORSTRING;
    multimap<string,string> mymultimap;

    while ((size_pos = strText.find_first_of(strSeparator, size_pos)) != string::npos) //找到子串
    {
        vectormap.push_back(strText.substr(size_prev_pos, size_pos - size_prev_pos));//取子串
        size_prev_pos = ++size_pos; //下一子串起始位置、结束位置=当前子串结束位置+1
    }
    if (size_prev_pos != strText.size())//判断有无最后一个子串
    {
        vectormap.push_back(strText.substr(size_prev_pos, size_pos - size_prev_pos));
    }

    VECTORSTRING::iterator vectormap_t = vectormap.begin();
    for (; vectormap_t != vectormap.end(); vectormap_t++)
    {
        cout << "vectormap_t  : " << *vectormap_t << endl;
    }

    VECTORSTRING::iterator map_it = vectormap.begin();
    string t;

    //排序使用算法sort对单词word中的字符排序
    for (; map_it != vectormap.end(); map_it++)
    {
        t = *map_it;
        sort(t.begin(), t.end());
        mymultimap.insert(pair<string, string>(t, *map_it));

    }

    //插入myse<string>
    multimap<string, string>::iterator mymultimap_t = mymultimap.begin();
    while (mymultimap_t != mymultimap.end())
    {
        myset.insert((*mymultimap_t).first);
        mymultimap_t++;
    }


    set<string>::iterator myset_t = myset.begin();
    while (myset_t != myset.end())
    {
        cout <<"myset_t = "<< *myset_t << endl;
        myset_t++;
    }
    cout << endl;
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值