题目描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:
1
≤
n
≤
1000
1 \leq n \leq 1000
1≤n≤1000 ,输入的字符串长度满足
1
≤
l
e
n
(
s
t
r
)
≤
10
1 \leq len(str) \leq 10
1≤len(str)≤10 ,
1
≤
k
≤
n
1 \leq k \leq n
1≤k≤n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1
输入:3 abc bca cab abc 1
输出:2
bca
示例2
输入:6 cab ad abcd cba abc bca abc 1
输出:3
bca
说明:abc的兄弟单词有cab cba bca,所以输出3
经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca
题解
下面展示本人题解思路代码。
const rl = require("readline").createInterface({ input: process.stdin })
var iter = rl[Symbol.asyncIterator]()
const readline = async () => (await iter.next()).value
void (async function () {
// Write your code here
//接收并处理输入
let line = await readline()
let arr = line.split(" ")
let keyWord = arr[arr.length - 2]
let k = arr.pop()
let arr1 = []
for (i = 1; i <= arr[0]; i++) {
if (
//排除重复单词
arr[i] != keyWord &&
// 按字典序排序后完全相同的单词
arr[i].split("").sort().join() == keyWord.split("").sort().join()
) {
arr1.push(arr[i])
}
}
// 查找按照字典顺序排序后的第k个兄弟单词
arr1.sort()
console.log(arr1.length)
if (arr1.length >= k) {
console.log(arr1[k - 1])
}
})()
文章系原创,在阅读过程中如若有误,劳请指正;如若有妙解、疑惑也欢迎大家和我交流,感谢!