Leetcode49. 字母异位词分组(java实现)

今天我来给大家分享的是leetcode49的解题思路,题目描述如下

如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。

本道题的大题思路是:
首先遍历strs,然后统计每一个数组元素出现的次数,之后在用一个标识将它作为key,然后存入map。

我觉得结合代码来理解更好理解。

代码如下:

java 复制代码
public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map= new HashMap<>();
        for (String str : strs) {
            int arr[] = new int[26];
            for (int i = 0;i<str.length();i++){
                arr[str.charAt(i)-'a']++;
            }
            StringBuffer st = new StringBuffer();
            for (int i = 0;i<26;i++){
                if (arr[i]!=0){
                    st.append('a'+i);
                    st.append(arr[i]);
                }
            }
            String key = st.toString();
            List<String> list = map.getOrDefault(key, new ArrayList<String>() );
            list.add(str);
            map.put(key,list);

        }
        return new ArrayList<List<String>>(map.values());
        }

我们先看第一个for循环,它的目的是统计eat每个字母出现的次数。

然后继续往下走,

第二个for循环的目的是遍历arr,然后并为每个字母打上一个标识,比如eat,经历过这个for循环之后结果就是a1e1t1,并将它作为后续map的key,因为异位词不看顺序只看出现的次数。

然后我们继续往下走,

List<String> list = map.getOrDefault(key, new ArrayList<String>());这段代码的含义,这个非常重要。

然后将str加入到list中,并将'a1e1t1'作为map的key,value就是这个list。

如果是字母异位词,那么他们List<String> list = map.getOrDefault(key, new ArrayList<String>());这里的list应该是同一个list,那么list集合中的数据就是同一组的有效字母异位词。

总体的三步走:
1.统计每个字母出现的次数
2.为每个str赋予一个标识(key)
3.通过这个key看map是否已经有数据。

到此,本题的讲解结束,本道题我建议大家结合代码去看,因为只看思路确实有点思路。

相关推荐
wxin_VXbishe21 分钟前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
生锈的键盘22 分钟前
推荐算法实践:交叉特征的理解
算法
一个网络学徒24 分钟前
python5
java·服务器·前端
workflower28 分钟前
业务需求-假设场景
java·数据库·测试用例·集成测试·需求分析·模块测试·软件需求
乌萨奇也要立志学C++35 分钟前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米44 分钟前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
专注VB编程开发20年1 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
(>_<)1 小时前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农1 小时前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
Dovis(誓平步青云)1 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法