当前位置: 首页 > news >正文

力扣热题100刷题day63|49.字母异位词分组

一、哈希表相关理论

代码随想录刷题day15|(哈希表篇)242.有效的字母异位词、383.赎金信-CSDN博客

二、思路

首先,创建一个map集合,遍历字符串数组,对数组中每一个字符串(单词)比如"abc" 进行如下操作:创建一个长度为26的数组count,遍历当前字符串,计算出每个字母出现的次数,用count来存储元素中每个字母出现的次数,之后将数组count转换成对应字符串(通过sb,添加数组元素,然后toString);

map集合中的键就存放该频率字符串,也就是"1#1#1#0#...." (以"abc"为例);

map集合中键对应的值则存放 当前遍历(操作)的原数组中的字符串(字母)即 "abc";所以值的类型是列表 list<String>;

“abc” ---> [1,1,1,0,0.....] --->“#1#1#1#0.....”=key

map中添加的逻辑是:首先 判断该key是否存在,如果不存在,则创建一个ArrayList对象,如果存在,无需创建;

不管key存不存在,都要再将当前 处理的字符串“abc” 添加到list列表中["abc","acb","bca"];

那么最终,map中所有的值value 就是所有的字母异位词的分组,比如:

key:“#1#1#1#0.....”    value:["abc","acb","bca"]

key:"#0#1#1#1#0..."  value:["bcd","bdc","cdb"]

.......

最后获取map中的所有值的集合map.values(),返回(Collection<List<String>>);

也就是值是什么类型 外层再加一个collection;

new ArrayList<>(...)    将 Collection 转换为 List,确保返回类型正确且可修改;

核心思路

  1. 字母计数

    • 为每个单词创建一个长度为26的数组,统计每个字母出现的次数

    • 例如:"aab" → [2,1,0,0,...,0](a出现2次,b出现1次)

  2. 生成唯一键

    • 将计数数组转换为不可变的数据结构(如元组或字符串)作为哈希表的键

    • 例如:[2,1,0,...] → 转换为元组 (2,1,0,...) 或字符串 "2#1#0#..."

  3. 哈希表分组

    • 使用这个键将原始单词分组存储

三、相关题目

49.字母异位词分组

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String str : strs){
            int[] count = new int[26];
            for(char c : str.toCharArray()){
                //int[] count = new int[26];
                count[c - 'a']++;
            }
            StringBuilder sb = new StringBuilder();
            for(int i : count){
                sb.append("#");
                sb.append(i);
            }
            String k = sb.toString();
            if(!map.containsKey(k)){
                List<String> list = new ArrayList<>();
                map.put(k, list);
            }
            map.get(k).add(str);
            }
            return new ArrayList<>(map.values());
        }
    }

四、总结

本题和有效的字母异位词不太一样,因为涉及到分组,怎么分组,怎么得到分组后的最终结果,但是最初处理字母异位词的逻辑相同,均使用数组;

还有最后的map集合put键值对的逻辑,如果按照下面的写法:

String k = sb.toString();
if(!map.containsKey(k)){
    //map中不包含k
    List<String> list = new ArrayList<>();
    list.add(str);
    map.put(k, list);
}

错因:只在key不存在时添加字符串,这样会漏掉后续相同key的字符串;

每次遇到一个字符串时,都创建了一个新的 ArrayList 并覆盖了 Map 中已有的值,这样会导致之前的同组异位词被覆盖丢失;

只有当key不存在时才创建新list;

无论key是否存在,都要将当前字符串添加到对应的list中;

相关文章:

  • Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8
  • Uniapp Vue 实现当前日期到给定日期的倒计时组件开发
  • 8.4 容器2
  • 尼日利亚拉各斯云服务器和VPS的综合分析,涵盖其优势、价格、推荐服务商及选择建议
  • 大模型论文:Language Models are Unsupervised Multitask Learners(GPT2)
  • netstat 查看端口占用、杀死进程
  • JAVA实现在H5页面中点击链接直接进入微信小程序
  • 课堂总结。
  • edge 更新到135后,Clash 打开后,正常网页也会自动跳转
  • 微服务拆分的原则、时机、方法以及常见问题
  • C++中stack函数的用法示例
  • 大模型——Llama Stack快速入门 部署构建AI大模型指南
  • 探索 Vue 3 中 vue-router 的 router.resolve () API
  • Python编程快速上手 让繁琐工作自动化笔记
  • 身份证号实名认证接口:让身份核验变得简单与高效
  • VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问
  • BUUCTF-web刷题篇(21)
  • 3.8/Q1,GBD数据库最新文章解读
  • CLAHE算法介绍
  • AIGC5——AIGC的伦理与法律挑战:数据隐私、真实性危机与版权治理
  • 东台做网站哪家便宜/广西网站建设制作
  • 企业网站备案信息/网站设计开发网站
  • 免费b2b网站大全平台/怎么创建自己的网址
  • 类似淘宝网站建设费用/搜狗竞价
  • 网站优惠券怎么做的/子域名网址查询
  • 网站模版化配置/2345网址导航下载桌面