算法:HJ27 查找兄弟单词

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。

兄弟单词要求和原来的单词不同。例如: 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.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static boolean checkStr(String chars, String xStr) {
        Map<Character, Integer> map = new LinkedHashMap();
        Map<Character, Integer> map2 = new LinkedHashMap();
        for (int i = 0; i < chars.length(); i++) {
            map.put(chars.charAt(i), map.getOrDefault(chars.charAt(i), 0) + 1);
        }

        for (int i = 0; i < xStr.length(); i++) {
            map2.put(xStr.charAt(i), map2.getOrDefault(xStr.charAt(i), 0) + 1);

        }
        if (map.equals(map2)) {
            return true;
        }

        return false;
    }
    

    public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String [] arr = new String[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.next();
        }
        String xStr = scanner.next();
        int k = scanner.nextInt();
        char[] chars = xStr.toCharArray();
        int count = 0;
        String result = null;
        for (int i = 0; i < n; i++) {
            if(arr[i].length() != xStr.length()){
                continue;
            }
            if(arr[i].equals(xStr)){
                continue;
            }
            if(!checkStr(arr[i],xStr) ){
                continue;
            }
            count++;

            if(count==k){
                result = arr[i];
            }
        }
        System.out.println(count);
        if(result!= null)  System.out.println(result);
        
    }

}

 

参考别人的之后写的:

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static boolean isBroStr(String chars, String xStr){
        if(chars.length() != xStr.length() || chars.equals(xStr)){
                return false;
        }
        char[] chars1 = chars.toCharArray();
        char[] chars2 = xStr.toCharArray();
        Arrays.sort(chars1);
        Arrays.sort(chars2);

         if(String.valueOf(chars1).equals(String.valueOf(chars2))){
            return true;
        }
        return false;
    }


    public static void main(String[] args) {
          Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String [] arr = new String[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.next();
        }

        String xStr = scanner.next();
        int k = scanner.nextInt();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < arr.length ; i++) {
            if(isBroStr(arr[i],xStr)){
                list.add(arr[i]);
            }
        }

        System.out.println(list.size());
        if(list.size() >= k){
            Collections.sort(list);
            System.out.println(list.get(k-1));
        }

        
    }

知识点:

1.map之间也可以用equals比较

2. char []不能用equals比较

3.Arrays.的数组排序

4.Collections工具的排序

5.k值大于兄弟字符串个数的情况未考虑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值