题目描述:
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。
现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?
注意:字典中可能有重复单词。本题含有多组输入数据。
输入描述:
先输入单词的个数n,再输入n个单词。 再输入一个单词,为待查找的单词x 最后输入数字k
输出描述:
输出查找到x的兄弟单词的个数m 然后输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例:
输入:3 abc bca cab abc 1
输出:2 bca
解题思路:
首先,输入一个数字表示接下来要输入N个单词,存储这N个单词到vector中,再输入要对比的单词t,以及所要输出的单词序号idx;遍历所有单词,首先排除尺寸不一的和完全一样的,再对比剩下的单词,用两个map分别存储某单词和对比单词t的所有字符出现的次数,进行比对,若所有字符出现次数均完全一致,则说明该单词是兄弟单词,存储在result中;用sort函数对result排序,并输出结果。
测试代码:
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() { int number; cin>>number; vector<string> in; while(number--) { string s; cin>>s; in.push_back(s); } string t; cin>>t; int idx; cin>>idx; vector<string> result; for(int p=0;p<in.size();++p) { if(in[p].size()!=t.size()) { continue; } if(in[p]==t) { continue; } map<char,int> m1,m2; for(int m=0;m<t.size();++m) { m1[in[p][m]]++; m2[t[m]]++; } bool isright=true; for(int m=0;m<t.size();++m) { if(m1[t[m]]!=m2[t[m]]) { isright=false; break; } } if(isright) { result.push_back(in[p]); } } sort(result.begin(),result.end()); if(result.size()!=0) { cout<<result.size()<<endl; cout<<result[idx-1]<<endl; } else{ cout<<'0'<<endl; } return 0; }