LeetCode49.字母异味词分组

我一开始的思路就是用1个hashmap<Integer,List<String>>,Integer存的的是字符串所有字母ASCLL值的和,List里面放异位字符串,但是不是异位的字符串的ascll值也可能相同比如acd和abe,所以这个hashmap只能降低一点时间复杂度我还是要写一个方法来判断是不是异位字符串,就在我写的时候我突然意识到,这样的话hashmap的key会重复啊,我必须得想办法找到一个key使得异位字符串有相同的key其他没有。百思不得其解,最后还是点开了题解,刚点开,映入眼帘的"字母排序"四个字让我恍然大悟,我立马关掉题解自己写。

异位字符串把字母排完之后就是一样的啊,拿这个排完序的字符串作为key就好了啊,最简单的排序当然是冒泡了,但是我交换两个字母顺序的时候我写的str.charAt(i)=str.charAt(j),这行代码有问题,好像不能这样赋值,只能用双等号比较,然后就写了一个很屎的字符串排序,知道通过排序字母就知道如何解题了,以下是我的屎代码:

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
          List<List<String>> ans = new ArrayList<List<String>>();
          int n = strs.length;
          HashMap<String,List<String>> map = new HashMap<>();
          for(int i=0;i<n;i++){
              String strSort = strSort(strs[i]);
              if(map.containsKey(strSort)){
                     map.get(strSort).add(strs[i]);
              }else{
                   List value = new ArrayList<String>();
                   value.add(strs[i]);
                     map.put(strSort,value);
              }
          }
          for (String key:map.keySet()) {
            ans.add(map.get(key));
        }
        return ans;
    }
    public String strSort(String str){
        int n = str.length();
        char[] c = new char[n];
        for(int i=0;i<n;i++){
            c[i] = str.charAt(i);
        }
        for(int i=0;i<n;i++){
          for(int j = i+1;j<n;j++){
              if(c[i] > c[j]){
                  char tmp = c[i];
                  c[i] = c[j];
                  c[j] = tmp;
              }
          }
        }
        String s = new String();
        for(int i=0;i<n;i++){
            s+=c[i];
        }
        return s;
    }
}

看了下题解的代码,太牛了,很简洁,他都没自己排序

java 复制代码
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

先用toArray()方法把一个字符串变成字符串数组,然后用Arrays.sort()方法把字符串数组排序,然后通过传入一个字符串数组参数的构造方法创建这个排好了序的字符串,唉,我也是按照这三步写的,但是tmd我全是自己写的,这说明我对一些类的常用方法根本不熟悉。后面他没有进行key的判断,而是通过调用map.getOrDefault,其实原理一样,map.getOrDefault也是先看有没有这个key,有就拿出这个value,没有就返回设置的默认值,这里的默认值是新建一个list,后面就add,put。

题解还有一种不排序的方法,就是统计字母的频次,然后把频次的数字转成char加起来就是一个String,然后把这个String作为key,例如leetcode的key就是"00113000000100100001000000",这样异位字符串的key也是相同的。

相关推荐
海鸥-w1 小时前
什么是AOP
java
Cc.Y1 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川1 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸1 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck1 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787052 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev2 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha2 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞2 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu2 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++