题解 | #查找兄弟单词#
查找兄弟单词
http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
用multiset字典里的重复单词也能够捕捉到,判断兄弟单词,最开始我想到的是排列组合,但是这样不好比对,参考了一下大佬的代码,发现判断兄弟单词,可以通过长度,单词的字符集是否完全相同来判断,那么这就衍生了两个方法,首先对字典遍历,遍历的单词要么hash一下看是否和原来的单词的字符集是一样的,要么两个单词排序一下,看是否相等。
#include <string>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
bool isbrother(string s1,string s2)
{
if(s1.size()==s2.size()){
if(s1==s2) return false;
else {sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
if(s1==s2) return true;
else return false;
}
}//最外层if
else return false;
}
int main() {
unsigned N;
unsigned K;
string str,wtfind;//want to find
vector<string> word;
multiset<string> brother;//插入的兄弟单词已经按字典序排好了
cin>>N;
unsigned size=0;
while(N){
cin>>str;
word.push_back(str);
N--;
}//while
cin>>wtfind;
cin>>K;
for(unsigned i = 0;i<word.size();i++){
if(isbrother(wtfind,word[i])){
brother.insert(word[i]);
}
}//for
size = brother.size();
cout<<size<<endl;
if(size>=K){
auto it = brother.begin();
while(K){
++it;
--K;
}
cout<<*(--it)<<endl;
}
}