2021-09-16:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。按键2对应:'a', 'b', 'c'。按键3对应:'d', 'e', 'f'。按键4对应:'g', 'h', 'i'。按键5对应:'j', 'k', 'l'。按键6对应:'m', 'n', 'o'。按键7对应:'p', 'q', 'r', 's'。按键8对应:'t', 'u', 'v'。按键9对应:'w', 'x', 'y', 'z'。示例 1:输入:digits = "23",输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]。示例 2:输入:digits = "",输出:[]。示例 3:输入:digits = "2",输出:["a","b","c"]。

福大大 答案2021-09-16:

自然智慧。递归。

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

package main

import "fmt"

func main() {
    digits := "23"
    ret := letterCombinations(digits)
    fmt.Println(ret)
}

var phone = [][]byte{
    {'a', 'b', 'c'},      // 2    0
    {'d', 'e', 'f'},      // 3    1
    {'g', 'h', 'i'},      // 4    2
    {'j', 'k', 'l'},      // 5    3
    {'m', 'n', 'o'},      // 6
    {'p', 'q', 'r', 's'}, // 7
    {'t', 'u', 'v'},      // 8
    {'w', 'x', 'y', 'z'}, // 9
}

// "23"
func letterCombinations(digits string) []string {
    ans := make([]string, 0)
    if len(digits) == 0 {
        return ans
    }
    str := []byte(digits)
    path := make([]byte, len(str))
    process(str, 0, &path, &ans)
    return ans
}

func process(str []byte, index int, path *[]byte, ans *[]string) {
    if index == len(str) {
        *ans = append(*ans, string(*path))
    } else {
        cands := phone[str[index]-'2']
        for _, cur := range cands {
            (*path)[index] = cur
            process(str, index+1, path, ans)
        }
    }
}

执行结果如下:
图片


左神java代码