【Leetcode字符串--字符哈希/字符串相同点】49.字母异位词分组 HJ27.查找兄弟单词

本文探讨了LeetCode 49题——字母异位词分组和HJ27题——查找兄弟单词的解决方案。在49题中,通过将字符串排序后作为哈希键来找出字母异位词。而在HJ27题中,判断两个字符串是否为兄弟字符串,即排序后内容相同但原始顺序不同。这两个问题都利用了哈希表来优雅地解决字符串比较的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode 49.字母异位词分组

1.问题描述

在这里插入图片描述


2.解决方案

在这里插入图片描述
在这里插入图片描述

1.一看题就知道大概要用到hash了,但是如何优雅地使用哈希是个问题,从这道题,我们能够得出一个以后字符串的相关哈希的思路就是找共同点作为key,然后value作为具有相同点的元素的集合,其实找相同点这个比较容易想到,但是这个相同点怎么优雅的比较是个问题,一开始我想的是把每一个字符串做成一个map,key是字符,value是出现次数,这样如果map相同那肯定就符合条件了不是,但是很明显很丑陋这个想法,其实说白了就是相同点找的是map,而优雅的相同点应该是排序后的string才对!
2.总结就是找到优雅的相同点!

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String str:strs){
            //1.生成key,也即共同点
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            //2.
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key,list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}



HJ27.查找兄弟单词

1.问题描述

在这里插入图片描述

2.解决方案

1.如果相同字符串不算兄弟
2.如果不相同就对当前字符串和目标字符串排序然后比较,如果相同证明不是一个字符串但是排序后相同那就是兄弟字符串

import java.util.*;

public class Main {
    public static void main(String[] args) {
        //输入 6 cab ad abcd cba abc bca abc 1
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<String> list = new ArrayList<>();
        for(int i=0;i<n;i++){
            list.add(sc.next());
        }
        //排序标准字符串abc
        String str = sc.next();
        char[] strs = str.toCharArray();
        Arrays.sort(strs);
        String strSort = new String(strs);
        int k = sc.nextInt();
        //逻辑
        List<String> ans = new ArrayList<>();
        for(int i=0;i<n;i++){
            String s = list.get(i); 
            //相同的不算兄弟字符串
            if(str.equals(s)) continue;
            //不同的要比较是否是兄弟字符串 排序如果一样就是兄弟字符串
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String sSort = new String(chars);
            if(strSort.equals(sSort)) ans.add(s);
        }
        //排序输出
        Collections.sort(ans);
        System.out.println(ans.size());
        if(k<=ans.size()) System.out.println(ans.get(k-1));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值