描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。
现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?
注意:字典中可能有重复单词。本题含有多组输入数据。
输入描述:先输入单词的个数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
解法
此题主要考查字符串操作和排序。大致思路如下:
- 查询符合条件的兄弟单词,并存入列表;
- 对兄弟单词列表按照字典排序;
- 按照指定的位置从单词列表中查出单词。
/*
* Copyright (c) waylau.com, 2022. All rights reserved.
*/
package com.waylau.nowcoder.exam.oj.huawei;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
/**
* HJ27 查找兄弟单词.
* 描述:定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
* 兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。
* 现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?
* 注意:字典中可能有重复单词。本题含有多组输入数据。
* 输入描述:先输入单词的个数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
*
* @author <a href="https://waylau.com">Way Lau</a>
* @since 2022-08-16
*/
public class HJ027FindBrotherWords {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入先转为字符数组
String[] inArray = sc.nextLine().split(" ");
int inLength = inArray.length;
int k = Integer.valueOf(inArray[inLength - 1]);
String x = inArray[inLength - 2];
List<String> list = new ArrayList<>();
// 遍历只取输入的单词
for (int i = 1; i < inLength - 2; i++) {
String str = inArray[i];
if (!str.equals(x) && sortByNaturalOrder(str).equals(sortByNaturalOrder(x))) {
list.add(inArray[i]);
}
}
// 按照字典排序
list.sort(Comparator.naturalOrder());
System.out.println(list.size());
// 这里处理越界
if (k <= list.size()) {
System.out.println(list.get(k - 1));
}
// 关闭
sc.close();
}
private static String sortByNaturalOrder(String s) {
List<Character> list = new ArrayList<>();
for (Character ch : s.toCharArray()) {
list.add(ch);
}
// 按照字典排序
list.sort(Comparator.naturalOrder());
// 重新组成字符串
StringBuilder sb = new StringBuilder();
for (Character ch : list) {
sb.append(ch);
}
return sb.toString();
}
}
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html

京公网安备 11010502036488号