1. 题目
读题
考查点
2. 解法
思路
判断兄弟单词的几种方法
- 方法一:排序比较。这种方法是将两个单词的字母排序后比较是否相同,如果相同,则说明两个单词是兄弟单词,否则不是。这种方法的优点是简单易懂,缺点是排序需要一定的时间开销。
- 方法二:哈希表记录。这种方法是使用哈希表来记录每个单词的字符集和字符频率,然后比较两个单词的哈希表是否相同,如果相同,则说明两个单词是兄弟单词,否则不是。这种方法的优点是避免了排序的时间开销,缺点是需要额外的空间来存储哈希表。
- 方法三:数组计数。这种方法是使用一个长度为26的数组来记录每个单词中每个字母出现的次数,然后比较两个单词的数组是否相同,如果相同,则说明两个单词是兄弟单词,否则不是。这种方法的优点是空间开销较小,缺点是需要遍历两次每个单词。
代码逻辑
具体实现
public class HJ027 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] str = sc.nextLine().split("\\s+");
int n = Integer.valueOf(str[0]);
String[] array = new String[n];
for (int i = 1; i <= n; i++) {
array[i - 1] = str[i];
}
String word = str[n + 1];
int k = Integer.valueOf(str[n + 2]);
findBrotherWord(array, word, k);
}
public static void findBrotherWord(String[] array, String word, int k) {
List<String> list = new ArrayList<>();
for (String cur : array) {
if (isBrother(word, cur)) {
list.add(cur);
}
}
System.out.println(list.size());
Collections.sort(list);
if (k < list.size()) {
System.out.println(list.get(k - 1));
}
}
public static boolean isBrother(String word, String curWord) {
if (word.length() != curWord.length() || word.equals(curWord)) {
return false;
}
return sort(word).equals(sort(curWord));
}
public static String sort(String word) {
char[] arr = word.toCharArray();
Arrays.sort(arr);
StringBuffer sb = new StringBuffer();
for (char c : arr) {
sb.append(c);
}
return sb.toString();
}
}