目录
牛客_查找兄弟单词(排序+模拟)
题目:
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
解析代码
题意解析:
兄弟单词的含义:两个单词不同, 长度相同, 但是构成的字母顺序不相同输入描述: 先输入字典中单词的个数n,再输入n个单词作为字典单词。 再输入一个单词,查找其在字典中兄弟单词的个数m 再输入数字k 输出描述: 根据输入,输出查找到的兄弟单词的个数m 然后输出查找到的兄弟单词的第k个单词。 注意!! 一定要关注最终返回的第 k 个单词这样的序号, 不能搞错. 题意说的是 "字典", 因此要将里面的单词按照字典序排序,否则得到的 k 会存在问题。
解题思路:
- 将字典中的单词先放到 vector 中。
- 将 vector 进行排序。
- isBrother 函数依次判定每个输入的单词是否是兄弟单词。
判定兄弟单词的规则是 :
- 先判定长度。
- 如果长度相同, 再看是否是完全相同(完全相同不算兄弟)。
- 然后将两个单词排序, 排序相同才是真兄弟单词。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool isBrother(string str1, string str2)
{
// 大小相同
if (str1.size() != str2.size())
return false;
// 字符顺序不同, 内容不同
if (str1 == str2)
return false;
// 排序之后,内容相同
sort(str1.begin(), str1.end());
sort(str2.begin(), str2.end());
return str1 == str2;
}
int main()
{
int n = 0, k = 0;
vector<string> vec;
string curStr;
while (cin >> n)
{
vec.clear();
for (int i = 0; i < n; ++i)
{
string str;
cin >> str;
vec.push_back(str);
}
cin >> curStr;
cin >> k;
// 给候选按照字典序排序
sort(vec.begin(), vec.end());
// 遍历,查找兄弟单词
int count = 0;
string kStr;
for (string& s : vec)
{
if (isBrother(s, curStr))
{
++count;
// 记录第k个兄弟单词
if (count == k)
kStr = s;
}
}
cout << count << endl;
if (count >= k)
cout << kStr << endl;
}
}