2021-09-25:给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词指字母相同,但排列不同的字符串。示例 1:输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"],输出: [["bat"],["nat","tan"],["ate","eat","tea"]]。示例 2:输入: strs = [""],输出: [[""]]。示例 3:输入: strs = ["a"],输出: [["a"]]。

福大大 答案2021-09-25:

自然智慧。
方法一:对字符串排序,放哈希表。
方法二:记字符串的字符个数,放哈希表。
这两种方法,本质都是一样的。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "sort"
)

func main() {
    strs := []string{"eat", "tea", "tan", "ate", "nat", "bat"}
    ret := groupAnagrams1(strs)
    fmt.Println(ret)
    ret = groupAnagrams2(strs)
    fmt.Println(ret)
}

func groupAnagrams1(strs []string) [][]string {
    map0 := make(map[string][]string)
    for _, str := range strs {
        record := make([]int, 26)
        for _, cha := range str {
            record[cha-'a']++
        }
        builder := make([]byte, 0)
        for _, value := range record {
            builder = append(builder, fmt.Sprintf("%d", value)...)
            builder = append(builder, "_"...)
        }
        key := string(builder)
        if _, ok := map0[key]; !ok {
            map0[key] = make([]string, 0)
        }
        map0[key] = append(map0[key], str)
    }
    res := make([][]string, 0)
    for _, list0 := range map0 {
        res = append(res, list0)
    }
    return res
}

func groupAnagrams2(strs []string) [][]string {
    map0 := make(map[string][]string)
    for _, str := range strs {
        chs := []byte(str)
        sort.Slice(chs, func(i, j int) bool {
            return chs[i] < chs[j]
        })
        key := string(chs)
        if _, ok := map0[key]; !ok {
            map0[key] = make([]string, 0)
        }
        map0[key] = append(map0[key], str)
    }
    res := make([][]string, 0)
    for _, list0 := range map0 {
        res = append(res, list0)
    }
    return res
}

执行结果如下:
图片说明


左神java代码