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

相关推荐
_Evan_Yao7 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd8 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼8 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122668 小时前
TCP 1
java·1024程序员节
企业数字化笔记10 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
金銀銅鐵11 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
?abc!11 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
AI人工智能+电脑小能手11 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck13 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280413 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis