LeetCode17 电话号码的字母组合

32 阅读1分钟

leetcode.cn/problems/le…

image.png

解法一:回溯法

var digitToCharMap = map[rune][]string{
	'2': []string{"a", "b", "c"},
	'3': []string{"d", "e", "f"},
	'4': []string{"g", "h", "i"},
	'5': []string{"j", "k", "l"},
	'6': []string{"m", "n", "o"},
	'7': []string{"p", "q", "r", "s"},
	'8': []string{"t", "u", "v"},
	'9': []string{"w", "x", "y", "z"},
}

func letterCombinations(digits string) []string {
	var res []string
    if len(digits) == 0{
        return res
    }
    path := ""
    backtrack(digits, 0, path, &res)
    return res
}

func backtrack(digits string, offset int, path string, res *[]string) {
	if len(path) == len(digits) { // 找到一个字母组合
		*res = append(*res, path)
		return
	}
	for i := offset; i<len(digits); i++{ // 遍历输入的每个数字,通过offset控制递归不会重复选择同个数字的字母集
        letters, ok := digitToCharMap[rune(digits[i])]
        if !ok{
            continue
        }
        for _, s := range letters{ // 遍历当前选中数字的字母集,逐个搭配
            raw := path
            path+= s // 做选择
            backtrack(digits, i+1, path, res) // 决策树下一层只能选择后面数字的字母集进行组合
            path= raw // 撤销选择
        }
    }
}