题解 | #查找兄弟单词# 哈希表

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

思路

  1. 统计 target 中每个字符的次数(记,
  2. 遍历字典 words
    • 当前单词中字符出现次数和 target 中一致(对应 isBrother 方法),且和 target 不同,说明二者是“兄弟”,则使用 list 收集当前单词 word
  3. 最终 list 中的元素个数,即为“兄弟单词个数”。若 list 中元素个数大于 ,则排序后取第 个元素
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 输入
        int n = in.nextInt();
        String[] words = new String[n];
        for (int i = 0; i < n; i++) {
            words[i] = in.next();
        }
        String target = in.next();
        int k = in.nextInt();
        // 统计 target 中每个字符的次数
        Map<Character, Integer> map = new HashMap<>();
        for (char c : target.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        int sum = 0;
        List<String> list = new ArrayList<>();
        for (String word : words) {
            if (isBrother(word, map) && !word.equals(target)) {
                list.add(word);
            }
        }
        System.out.println(list.size());
        if (list.size() >= k) {
            Collections.sort(list);
            System.out.println(list.get(k - 1));
        }
        in.close();
    }

    static boolean isBrother(String s, Map<Character, Integer> map) {
        Map<Character, Integer> cntMap = new HashMap<>();
        for (char c : s.toCharArray()) {
            cntMap.put(c, cntMap.getOrDefault(c, 0) + 1);
        }
        if (cntMap.size() != map.size()) {
            return false;
        }
        for (char key : cntMap.keySet()) {
            if (cntMap.get(key) != map.getOrDefault(key, 0)) {
                return false;
            }
        }
        return true;
    }
}
全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务