【力扣】之字母异位词分组

368 阅读3分钟

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在

絮叨

今天群友,分享了一道力扣题,然后刚好我早上没啥事,就去做了一下,然后顺便记录一下,不过顺便说一下,小六六群里的学习氛围还真的不错,这也是我检查分享的一个重要原因吧,大佬也很多,字节的大佬,还有很多在校生,反正如果你没有一个很好的学习氛围的话,小六六学习群是个不错的选择。哈哈扯远了,我们来看看群友出的题,还算蛮简单,但是由于基础的原因,也没做到多好

题目

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:


输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

说明:

所有输入均为小写字母。 不考虑答案输出的顺序。

我们来解一下题目的意思,其实就是说要把数组里面的元素,一个个把它去做对比,找出里面字符串有不同的数据就好了,其实我一开始还没想到,想着一个个去对比,我的天,那样太复杂了,后面想到了把字符串排序之后,那如果是包含相同的字符串的话,那就是一样的了,哈哈,那就比较简单了,来看下小六六写的代码

解题


package com.liuliu.nio.test;

import java.util.*;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/9/2 9:16
 *
 * 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
 *
 * 示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出:
 * [
 *   ["ate","eat","tea"],
 *   ["nat","tan"],
 *   ["bat"]
 * ]
 *说明:
 *
 * 所有输入均为小写字母。
 * 不考虑答案输出的顺序。
 *
 */
public class GroupAnagrams {


    public List<List<String>> groupAnagrams(String[] strs) throws Exception {
        if (null == strs) {
            return new ArrayList<>();
        }
        List<List<String>> listList = new ArrayList<>();
        HashMap<String, List<String>> map = new HashMap();
        for (String str : strs) {
            //treeSet 去重了 ,不符合结果
//            TreeSet<String> treeSet = new TreeSet<String>();
//            String[] split = str.split("");
//            for (String s : split) {
//                treeSet.add(s);
//            }
//            StringBuffer s = new StringBuffer();
//            for (String s1 : treeSet) {
//                s.append(s1);
//            }
            //另外的排序方案
            char[] chs1 = str.toCharArray();
            Arrays.sort(chs1);
            String s = String.valueOf(chs1);
            if (map.containsKey(s.toString())) {
                map.get(s.toString()).add(str);
            } else {
                List<String> strings1 = new ArrayList<>();
                strings1.add(str);
                map.put(s.toString(), strings1);
            }
        }
        listList.addAll(map.values());
        System.out.println(listList.toString());
        return listList;

    }

    public static void main(String[] args) throws Exception {
        String[] strings = {"eat", "tea", "tan", "ate", "nat", "bat"};
        String[] strings1={"ddddddddddg","dgggggggggg"};
        GroupAnagrams groupAnagrams = new GroupAnagrams();
        List<List<String>> lists = groupAnagrams.groupAnagrams(strings1);
    }
}


对于字符串排序,我一开始想到了treeset,但是提交的时候不通过,原因是treeSet它是一个去重并排序的set,这个就很尴尬了,和人家的要求不符合,然后我就把字符串变成一个Char[] 再去排序,然后在变回来string 发现是可以的

来看看Python的解法

class Solution(object):
    def groupAnagrams(self, strs):
        ans = collections.defaultdict(list)
        for s in strs:
            ans[tuple(sorted(s))].append(s)
        return ans.values()

我擦,字典是真的香呀,这多么简单。代码量是真的少,羡慕。哈哈。

结尾

花点时间总结分享一下,虽然小六六很菜,但是我可以越菜越学到越学越菜嘛,哈哈 你懂的越多,你就越菜。

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !