描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:1 \le n \le 1000 \1≤n≤1000 ,输入的字符串长度满足 1 \le len(str) \le 10 \1≤len(str)≤10 , 1 \le k < n \1≤k<n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
示例1
分析
按要求获取字符串,注意使用next()而不是nextLine().
获取字符串得兄弟字符串,然后打印第k个字符串。
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String[] str = new String[n];
for (int i = 0; i < n; i++) {
str[i] = scan.next();
}
String s = scan.next();
int k = scan.nextInt();
char[] ch = s.toCharArray();
Arrays.sort(ch);
List<String> list = new ArrayList<>();
for (String st : str) {
if (st.equals(s)) {
continue;
}
if (process(st,ch)) {
list.add(st);
}
}
Collections.sort(list,new Comparator<String>(){
public int compare(String a, String b) {
return a.compareTo(b);
}
});
// Collections.sort(list,(a,b)->(a.compareTo(b)));
if (list.size() < k) {
System.out.println(list.size());
} else {
System.out.println(list.size());
System.out.println(list.get(k-1));
}
}
public static boolean process(String str, char[] ch) {
if (str.length() != ch.length) {
return false;
}
char[] s = str.toCharArray();
Arrays.sort(s);
for (int i = 0; i < str.length(); i++) {
if (s[i] != ch[i]) {
return false;
}
}
return true;
}
public static int compare(String a, String b) {
int i = 0;
while (i < a.length() && i < b.length()) {
if (a.charAt(i) != b.charAt(i)) {
return a.charAt(i) - b.charAt(i);
}
i++;
}
return 0;
}
}