LeetCode 49 - 字母异位词分组 - 解题思路记录 - Golang

985 阅读2分钟

今天来介绍一下,第49题的解题思路,这一道题稍微简单一些,主要的考核点是对map的认识,
先来看一下题目介绍

Given an array of strings, group anagrams together.

Example

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

题目很简答, 给定一个字符串的数组, 输出由同样字符组成的二维数组, 在这里最难理解的一点则是怎么确定记录曾经出现过的次他是跟并且后面的词是一样的

我们来先看一段代码, 然后在详细解释其中代码的思维

func groupAnagrams(strs []string) [][]string {
	fm := make(map[string][]string)
	result := [][]string{}
	for _, word := range(strs){
		charSet := [26]int{0}
		for _, ch :=range(word){
			index := ch - 97
			charSet[index] += 1
		}
		key := strings.Replace(strings.Trim(fmt.Sprint(charSet), "[]"), " ", "", -1) //数组转换成字符串
		fm[key] = append(fm[key], word)
	}
	for _, item := range(fm){
		result = append(result, item)
	}
	return result
}

代码比较少, 野容易懂, 好我们直接开始吧

fm := make(map[string][]string)
result := [][]string{}

首先定义一个map的数组,key是string value是一个字符串数组, result就是返回的结果

接着我们来看内层2层循环, 分别是对形参strs的遍历, 以及对strs的子元素遍历, 画个图举个例子

strs, word, ch的意思在图上, 接着我们看一下 charSet是个什么东西, 为什么初始化就26个0

charSet其实就是存放着字符串word出现过哪些字母,并且把这些字母出现的次数放进这个长度为26的数组中,我们看个图

index := ch - 97
charSet[index] += 1

这段代码就是charSet所表示的内容

接下来

key := strings.Replace(strings.Trim(fmt.Sprint(charSet), "[]"), " ", "", -1) //数组转换成字符串

没什么特别,就是把[1,0,0,0,....0]的数组转换成1000000的字符串,作为map的key而准备的

fm[key] = append(fm[key], word)

如果说, key 的值存在map中的话,就把元素添加到尾部, 如果不存在的话,就成为一个新的key,再把word添加进去

for _, item := range(fm){
	result = append(result, item)
}

最后就是把fm遍历出来,赋值给result, 返回出去则可

这样子就又做完一道题目了,!直至目前为止,题目都比较简单,但之后的题目可能会越来越难,越来越涉及到更多的数据结构, 循循渐进吧! 加油

其他相关题目连接

LeetCode 5 - 回文串 - 解题思路记录 - GoLang

LeetCode 15 - 3数之和 - 解题思路记录 - GoLang

LeetCode 12 - 罗马数字 - 解题思路记录 - GoLang

LeetCode 2 - 两数之和 - 解题思路记录 - GoLang

LeetCode 21 - 合并有序链表 - 解题思路记录 - GoLang