github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/leetcode/phone-number_test.go (about)

     1  package leetcode
     2  
     3  import "testing"
     4  
     5  func TestLetterCombinations(t *testing.T) {
     6  	res := letterCombinations("213")
     7  	t.Log(res)
     8  }
     9  
    10  // 17. 电话号码的字母组合
    11  // https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
    12  
    13  func letterCombinations(digits string) []string {
    14  	if len(digits) == 0 {
    15  		return nil
    16  	}
    17  	letterMap := make(map[rune][]rune)
    18  	letterMap['2'] = []rune{'a', 'b', 'c'}
    19  	letterMap['3'] = []rune{'d', 'e', 'f'}
    20  	letterMap['4'] = []rune{'g', 'h', 'i'}
    21  	letterMap['5'] = []rune{'j', 'k', 'l'}
    22  	letterMap['6'] = []rune{'m', 'n', 'o'}
    23  	letterMap['7'] = []rune{'p', 'q', 'r', 's'}
    24  	letterMap['8'] = []rune{'t', 'u', 'v'}
    25  	letterMap['9'] = []rune{'w', 'x', 'y', 'z'}
    26  	var s []rune
    27  	var res []string
    28  	findCombination(0, []rune(digits), letterMap, s, &res)
    29  	return res
    30  }
    31  
    32  func findCombination(index int, text []rune, letterMap map[rune][]rune, s []rune, res *[]string) {
    33  	if index == len(text) {
    34  		// 递归的出口就是解
    35  		*res = append(*res, string(s))
    36  		return
    37  	}
    38  	arr, ok := letterMap[text[index]]
    39  	if !ok {
    40  		// 没有找到就直接继续
    41  		findCombination(index+1, text, letterMap, s, res)
    42  		return
    43  	}
    44  	for i := range arr {
    45  		findCombination(index+1, text, letterMap, append(s, arr[i]), res)
    46  	}
    47  }