输入若干单词,单词之间的分隔符可以是任意的标点符号或空格。对每个单词,看它的等同单词在所有输入的单词中是否出现过,若没有出现,就输出原单词。所有要输出的单词按字典序顺序输出。
等同单词是指多个单词包含的字符完全相同,如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;
}