17. 电话号码的字母组合
一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用Go解决该问题涉及知识包括:
1. Go中map的初始化与使用
map可以使用make或者常量来初始化:
a := make(map[string]string)
a["key"] = "value"
fmt.Println(a)
b := map[string]string {
"keyb": "valueb",
}
fmt.Println(b)
2. for 循环控制
用习惯for-range后,真的比 for-i简洁好看好多。不仅可以遍历数组,切片,也可以遍历map,字符串。不需要某个参数时,可以将以_代替。
对于数组而言: 第一个参数表示索引,第二参数表示取值。对于map而言:第一个参数表示键,第二参数表示取值。
for _, letter := range letters {
// loop
}
3. append 切片添加元素
append可以向切片添加元素,并返回修改后的切片。
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
4. Go的指针:
这是我第一次使用Go的指针,按照C语言的方式使用,大概也就按照**&取地址,*取值**来操作。不多阐述。
回到题目上,这个题目个人认为官方将其复杂化了,或许是为了覆盖回溯算法这一考点吧。
算法1:三层循环,逐个追加。
其中的初始化 result := []string{""} 是我非常骄傲的一行代码 ^_^
func letterCombinations(digits string) []string {
if len(digits) == 0 {
return []string{}
}
numToLetterMap := map[string]string{
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz",
}
result := []string{""}
for _, v := range digits {
letters := numToLetterMap[string(v)]
temp := make([]string, 0)
for _, str := range result {
for _, letter := range letters {
temp = append(temp, str + string(letter))
}
}
result = temp
}
return result
}
算法2: 回溯(递归)。借鉴了官方的算法逻辑。
func letterCombinations(digits string) []string {
if len(digits) == 0 {
return []string{}
}
numToLetterMap := map[string]string{
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz",
}
result := []string{}
backtrack(digits, 0, "", &result, numToLetterMap)
return result
}
func backtrack(d string, index int, combination string, result *[]string, m map[string]string) {
if index == len(d) {
*result = append(*result, combination)
} else {
num := string(d[index])
letters := m[num]
for i := 0; i < len(letters); i++ {
backtrack(d, index+1, combination+string(letters[i]), result, m)
}
}
}
使用Go刷了力扣17道题目,Go的基础知识了解的差不多了,但是完整的Go逻辑却还没有建立,因此想看一点Go书籍,把知识串起来,后续大概会发一下阅读笔记之类的。