题解 | #查找兄弟单词#

查找兄弟单词

http://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68

我这个思路比较好理解,代码实现也不复杂,只能想到这个方法了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = bf.readLine()) != null){
            int len = str.length();
            int n = Integer.parseInt(String.valueOf(str.charAt(0)));
            int k = Integer.parseInt(String.valueOf(str.charAt(len - 1)));
            //将所有单词放到一个String数组中
            String[] dictionary = str.substring(2, len - 2).split(" ");
            //单词X所在的下标,没啥用,下面多次用到,减少时间复杂度
            int j = dictionary.length - 1;
            //将单词X转为char数组,然后按字母表排序
            char[] word = dictionary[j].toCharArray();
            Arrays.sort(word);
            //ArrayList用于存放兄弟单词
            ArrayList<String> characters = new ArrayList<>(n);
            for (int i = 0; i < j; i++) {
                //先排除长度不一样和未排序前相等的单词
                if (dictionary[i].length() == dictionary[j].length() && !dictionary[i].equals(dictionary[j])){
                    //剩下只有交换位置后可能是兄弟单词的单词,然后将单词排序后若相等则为兄弟单词(本来就是交换位置所得,都按字母表排序相等就是兄弟单词)
                    char[] temp = dictionary[i].toCharArray();
                    Arrays.sort(temp);
                    if (Arrays.equals(temp, word)){
                        characters.add(dictionary[i]);
                    }
                }
            }
            System.out.println(characters.size());
            Collections.sort(characters);
            if (k > 0 && k <= characters.size()){
                System.out.println(characters.get(k - 1));
            }
        }
    }
}

全部评论

相关推荐

2025-12-26 10:52
河北传媒学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务