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也是相同的。

相关推荐
最强小杰7 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
牧羊人.3337 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
Flynn Liang7 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞7 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长7 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
小郎君6587 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7778 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚8 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
雪芽蓝域zzs8 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
专注仿真8 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练