17. Letter Combinations of a Phone Number
Medium
Given a string containing digits from
2-9
inclusive, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
1
o-o_
2
abc
3
def
4
ghi_
5
jkl
6
mno
7
pqrs
8
tuv
9
wxyz
*
+___
0
___
#
↑__
除了0的第一個“”以外的位置的“”是為了對齊
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
大意是指要把輸入的數字按照手機鍵盤的對映關係轉成可能的字串
- 不要有重複的
- 不用在意字串順序(輸出結果陣列的排序)
Note:
雖然題目中給出輸入數字在[2, 9]
,實測(2019-01-05)
0
和1
也有對應的對映關係
0 => " "
1 => "*"
複製程式碼
基本分析:
- 要求長度為
n
的結果,首先要求長度為n-1
的結果! - n == 1 時候結果是已知的
"0" : [" "],
"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"]
複製程式碼
- 為了節約時間要有快取
基本思路
func letterCombinations(s: String) -> [String] {
if s 為空字串, return 空陣列
if cache 不包含 s {
cache[s] = cache[s的第一個字元] * letterCombinations(s除了第一字元以外剩下的部分的結果)
}
return cache[s]
}
複製程式碼
程式碼
// Swift Code
class Solution {
var cache: [String : [String]] = [
"0" : [" "],
"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"]
]
func letterCombinations(_ digits: String) -> [String] {
if digits.isEmpty { return [] }
if !cache.keys.contains(digits) {
cache[digits] = letterCombinations(String(digits.prefix(1))).flatMap({ (s) -> [String] in
letterCombinations(String(digits.suffix(digits.count - 1))).map { s + $0 }
})
}
return cache[digits]!
}
}
複製程式碼
TestCase
- ""
- "23"
- "203"
- "213"