描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:1≤�≤1000 1≤n≤1000 ,输入的字符串长度满足 1≤���(���)≤10 1≤len(str)≤10 , 1≤�<� 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
import java.util.*;
import java.util.stream.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String a = in.nextLine();
String[] array = a.split(" ");
int len = array.length;
int count = Integer.valueOf(array[0]);
int index = Integer.valueOf(array[len-1]);
String target = array[len-2];
String[] l = new String[len-3];
for (int i=1; i<len-2; i++) {
l[i-1]=array[i];
}
List<String> set = parseSet(l, target);
System.out.println(set.size());
if (index < set.size()) {
System.out.println(set.toArray()[index-1]);
}
}
}
public static List<String> parseSet(String[] array, String target) {
List<String> set = new ArrayList<>();
String key = sort(target);
for (String tmp : array) {
String sortT = sort(tmp);
if (sortT.equals(key)) {
if (!tmp.equals(target)) {
set.add(tmp);
}
}
}
Collections.sort(set);
return set;
}
public static String sort(String s) {
char[] a = s.toCharArray();
List<Character> list = new ArrayList<>();
for (char ch : a) {
list.add(ch);
}
Collections.sort(list);
return list.stream().map(o->o.toString()).collect(Collectors.joining(""));
}
}