📑 题目:17. 电话号码的字母组合

🚀 本题 LeetCode 传送门

题目大意

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

17. 电话号码的字母组合 - 图1

解题思路

  • DFS 递归深搜即可

代码

  1. package leetcode
  2. var (
  3. letterMap = []string{
  4. " ", //0
  5. "", //1
  6. "abc", //2
  7. "def", //3
  8. "ghi", //4
  9. "jkl", //5
  10. "mno", //6
  11. "pqrs", //7
  12. "tuv", //8
  13. "wxyz", //9
  14. }
  15. res = []string{}
  16. final = 0
  17. )
  18. // 解法一 DFS
  19. func letterCombinations(digits string) []string {
  20. if digits == "" {
  21. return []string{}
  22. }
  23. res = []string{}
  24. findCombination(&digits, 0, "")
  25. return res
  26. }
  27. func findCombination(digits *string, index int, s string) {
  28. if index == len(*digits) {
  29. res = append(res, s)
  30. return
  31. }
  32. num := (*digits)[index]
  33. letter := letterMap[num-'0']
  34. for i := 0; i < len(letter); i++ {
  35. findCombination(digits, index+1, s+string(letter[i]))
  36. }
  37. return
  38. }
  39. // 解法二 非递归
  40. func letterCombinations_(digits string) []string {
  41. if digits == "" {
  42. return []string{}
  43. }
  44. index := digits[0] - '0'
  45. letter := letterMap[index]
  46. tmp := []string{}
  47. for i := 0; i < len(letter); i++ {
  48. if len(res) == 0 {
  49. res = append(res, "")
  50. }
  51. for j := 0; j < len(res); j++ {
  52. tmp = append(tmp, res[j]+string(letter[i]))
  53. }
  54. }
  55. res = tmp
  56. final++
  57. letterCombinations(digits[1:])
  58. final--
  59. if final == 0 {
  60. tmp = res
  61. res = []string{}
  62. }
  63. return tmp
  64. }
  65. // 解法三 回溯(参考回溯模板,类似DFS)
  66. var result []string
  67. var dict = map[string][]string{
  68. "2" : []string{"a","b","c"},
  69. "3" : []string{"d", "e", "f"},
  70. "4" : []string{"g", "h", "i"},
  71. "5" : []string{"j", "k", "l"},
  72. "6" : []string{"m", "n", "o"},
  73. "7" : []string{"p", "q", "r", "s"},
  74. "8" : []string{"t", "u", "v"},
  75. "9" : []string{"w", "x", "y", "z"},
  76. }
  77. func letterCombinationsBT(digits string) []string {
  78. result = []string{}
  79. if digits == "" {
  80. return result
  81. }
  82. letterFunc("", digits)
  83. return result
  84. }
  85. func letterFunc(res string, digits string) {
  86. if digits == "" {
  87. result = append(result, res)
  88. return
  89. }
  90. k := digits[0:1]
  91. digits = digits[1:]
  92. for i := 0; i < len(dict[k]); i++ {
  93. res += dict[k][i]
  94. letterFunc(res, digits)
  95. res = res[0 : len(res)-1]
  96. }
  97. }