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

相关推荐
Wang's Blog14 小时前
Java 项目实战: 交友项目 - 查询评论列表
java·交友
sycmancia14 小时前
Qml——Text元素
java·前端·html
T_Apollo14 小时前
3.1 JVM 工作原理
java
荆棘鸟智能14 小时前
扬尘在线监测数据接入与异常清洗:从断点补传到质量审计
人工智能·算法·系统架构
Java内核笔记14 小时前
同一份知识库,4 种切分 × 3 种召回,纯关键词比纯向量高 13 个点
java·人工智能·spring boot
海岳云舟15 小时前
springboot单元测试技术
java·后端·spring
众链网络15 小时前
年卡跨淡旺季的有效期模型:不可用日期、次数与顺延规则
java·前端·数据库
文丑颜不良啊15 小时前
LeetCode926~950题目解析
java·leetcode
今天的砖头有点烫手啊15 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
动词ing15 小时前
【题目练习】旋转图像
算法