朴素的方法就是将匹配词和字典里面的词都排序比较,相同则输出,代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
char dic[5][10]={ "acd","adc","dac","abbb","asd" }; //字典
char word[]={"adc"}; //变位词
sort(word,word+3);
for(int i=0; i<5; i++){
char temp[10];
strcpy(temp,dic[i]);
sort(temp,temp+strlen(temp));
if(strcmp(word,temp)==0){
cout<<dic[i]<<endl;
}
}
return 0;
}
不过由于每次变换一个词都需要重新排一次序,采用变位词与标识捆绑的方法,将字典重新排序,后利用二分实现上下界的快速查找,这样就不必每次都要把字典遍历一遍了,同样是牺牲空间换取时间的方法,代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
string dic[10]={ "acd","adc","dac","abbb","asd","acde","edac","dace","deac","cad" };
string word="adc";
vector < pair<string,string> > vec;
sort(word.begin(),word.end());
for(int i=0; i<10; i++){
string temp = dic[i];
sort(temp.begin(),temp.end());
vec.push_back(make_pair(temp,dic[i]));
}
vector < pair<string,string> >::iterator it;
it = lower_bound(vec.begin(),vec.end(),make_pair(word,word));
while(it->first==word){
cout<<it->second<<endl;
it++;
}
return 0;
}