描述
定义一个字符串 s 的“兄弟单词”为:将 s 重新排序后得到的与原字符串不同的新字符串。
现在,对于给定的 n 个字符串 s1,s2,…,sn 和另一个单独的字符串 x,你需要解决两个问题:
∙统计这 n 个字符串中,有多少个是 x 的“兄弟单词”(注意,这 n 个字符串可能有重复,重复字符串分别计数);
∙将这 n 个字符串中 x 的“兄弟单词”按字典序从小到大排序,输出排序后的第 k 个兄弟单词(从 1 开始计数)。特别地,如果不存在,则不输出任何内容。
【名词解释】
从字符串的第一个字符开始逐个比较,直至发现第一个不同的位置,比较这个位置字符的字母表顺序,字母序较小的字符串字典序也较小;如果比较到其中一个字符串的结尾时依旧全部相同,则较短的字符串字典序更小。
输入描述:
在一行上依次输入:
∙一个整数 n(1≦n≦103) 代表字符串的个数;
∙n 个长度为 1≦length(si)≦10,仅由小写字母构成的字符串 s1,s2,…,sn ;
∙一个长度为 1≦length(x)≦10,仅由小写字母构成的字符串 x ;
∙一个整数 k(1≦k≦n) 代表要查找的第 k 小的兄弟单词的序号。
输出描述:
第一行输出一个整数,代表给定的 n 个字符串中,x 的“兄弟单词”的数量;
第二行输出一个字符串,代表将给定的 n 个字符串中 x 的“兄弟单词”按字典序排序后的第 k 小兄弟单词。特别地,如果不存在,则不输出任何内容(完全省略第二行)。
示例1
输入:
3 abc bca cab abc 1
输出:
2
bca
说明:
在这个样例中,x 的兄弟单词为 "acb" 、"bac" 、"bca" 、"cab" 、"cba" 。其中,标橙色的两个字符串存在于所给定的 n 个字符串中。第 1 小的兄弟单词为 "bca"。
示例2
输入:
3 a aa aaa a 1
输出:
0
说明:
在这个样例中,按照定义,字符串 "a" 没有兄弟单词。
判断兄弟单词技巧:
不采用求子串的方式,直接通过字符串对比的方式
box[i].split(“”).sort().join(“”)===target && box[i]!==target
void async function () {
// Write your code here
while(line = await readline()){
let tokens = line.split(' ');
const num = tokens[0]*1;
const box = tokens.slice(1,num+1);
const target = tokens[num+1];
const kIdx = tokens[tokens.length-1];
const rightBox = [];
//console.log(kIdx)
//console.log(target,'target')
//console.log(box)
for(let i=0;i< num; i++){
if(box[i].split("").sort().join("")===target && box[i]!==target){
rightBox.push(box[i]);
}
}
console.log(rightBox.length);
//console.log(rightBox)
if(rightBox[kIdx]){
console.log(rightBox[kIdx-1])
}
}
}()




