1、题目
2、题解
1)自己解答:看到题目,首先想到的就是动态规划的方法,例如 “234” 就是在 “23” 的所有情况下再依次加上 “4”的字母,可以此类推。但同时也考虑到一个问题,全部8个数字,若使用动态规划遍历全部情况,则需要消耗大量的内存。之后考虑到了状态机的方法,即依次遍历数字字符,根据当前字符跳转状态,在已有字母的基础上再加上对应数字对应的字符。
代码如下:
func letterCombinations(digits string) []string {
values := []string{}
for i, num := range digits{
tmp := []string{}
tmp = append(tmp, values...)
if i== 0{
switch num{
case '2':
values = append(values, []string{"a","b","c"}...)
case '3':
values = append(values, []string{"d","e","f"}...)
case '4':
values = append(values, []string{"g","h","i"}...)
case '5':
values = append(values, []string{"j","k","l"}...)
case '6':
values = append(values, []string{"m","n","o"}...)
case '7':
values = append(values, []string{"p","q","r","s"}...)
case '8':
values = append(values, []string{"t","u","v"}...)
case '9':
values = append(values, []string{"w","x","y","z"}...)
default:
}
}else{
switch num{
case '2':
for _, value := range tmp{
in := []string{value+"a",value+"b",value+"c"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '3':
for _, value := range tmp{
in := []string{value+"d",value+"e",value+"f"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '4':
for _, value := range tmp{
in := []string{value+"g",value+"h",value+"i"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '5':
for _, value := range tmp{
in := []string{value+"j",value+"k",value+"l"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '6':
for _, value := range tmp{
in := []string{value+"m",value+"n",value+"o"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '7':
for _, value := range tmp{
in := []string{value+"p",value+"q",value+"r",value+"s"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '8':
for _, value := range tmp{
in := []string{value+"t",value+"u",value+"v"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
case '9':
for _, value := range tmp{
in := []string{value+"x",value+"w",value+"y",value+"z"}
values = append(values[:0], values[1:]...)
values = append(values, in...)
}
default:
}
}
}
return values
}
提交结果如下:
2)参考题解:不同于不停的迭代,题解使用了回溯的方法,即使用递归的方法。我个人对于递归的使用还不是很熟练,很多参考了题解的答案,最后默写完成代码如下
var numMap map[string]string = map[string]string{
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz"}
var dig string
var combinations []string
func letterCombinations(digits string) []string {
dig = digits
combinations = []string{}
if len(digits) == 0{
return []string{}
}
letterCombination(0, "")
return combinations
}
func letterCombination(index int, nums string){
if index == len(dig){
combinations = append(combinations, nums)
}else{
letter := string(dig[index])
phoneLetter := numMap[letter]
for _, v := range phoneLetter{
letterCombination(index+1, nums+string(v))
}
}
}