《算法竞赛入门经典》5.3.2字符重排
问题描述:输入一个字典(用******结尾),然后输入若干个单词,每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出(如果不存,输出:()。输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成,注意,字典中的单词不一定按照字典序排列。
样例输入:
tarp given score refund only trap work earn course pepper part
******
resco nfudre aptr sett oresuc
样例输出:
score
refund
part tarp trap
:(
course
程序代码如下,cpp文件形式
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int exits(string,string);
int main()
{
vector<string> dic;
string word;
cin>>word;
while(word!="******"){
dic.push_back(word);
cin>>word;
}
//对字典进行排序
sort(dic.begin(),dic.end());
//输入待查询的词,#结束查询
cin>>word;
int flag=0;
while(word!="#"){
flag=0;
for(size_t i=0;i<dic.size();i++){
if(exits(word,dic[i])){
cout<<dic[i]<<" ";
flag=1;
}
}
if(!flag){
cout<<":(";
}
cout<<endl;
cin>>word;
}
//输出字典
cout<<"this is the dictonary:"<<endl;
for(size_t i=0;i<dic.size();i++){
cout<<dic[i]<<" ";
}
cout<<endl;
return 0;
}
int exits(string word,string str)
{
if(word.length()!=str.length()){
return 0;
}
int flag=0;
sort(word.begin(),word.end());
sort(str.begin(),str.end());
size_t i=0;
for(i=0;i<word.length();){
if(word[i]==str[i]){
++i;
}else{
break;
}
}
return (i==word.length())?1:0;
}