Problem: HJ27 查找兄弟单词
题目描述
描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1
输入:
3 abc bca cab abc 1
输出:2 bca
算法流程
- 首先,将单词 x 排序,得到它的字母表表示形式 sorted_x。
- 遍历给定的 n 个单词,对每个单词按照以下规则进行处理:
- 如果当前单词的长度与 x 的长度不同,则跳过该单词。
- 否则,将当前单词排序,得到它的字母表表示形式 sorted_word。
- 如果 sorted_word 等于 sorted_x 且当前单词不等于 x,则将该单词添加到兄弟单词列表中。
- 对兄弟单词列表进行排序。
- 返回兄弟单词列表中第 k 个单词。
代码
function findBrotherWord(words, x, k) {
const sortedX = x.split('').sort().join('');
const brotherWords = [];
for (let i = 0; i < words.length; i++) {
if (words[i].length !== x.length) {
continue;
}
const sortedWord = words[i].split('').sort().join('');
if (sortedWord === sortedX && words[i] !== x) {
brotherWords.push(words[i]);
}
}
brotherWords.sort();
if (k > brotherWords.length) {
return 'No brother word found.';
} else {
return brotherWords[k - 1];
}
}
复杂度
-
时间复杂度:
-
空间复杂度: