Given a digit string, 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.git
Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].app
題目的意思是給咱們一個數字字符串Digit String,以後咱們須要輸出他們的所有的組合.
解決這道題目的思路就是用深度遍歷.函數
而後咱們來看一下具體的思路,假如給定的字符串是「234」;
2:[a, b, c]
3:[d, e, f]
4:[g, h, i]spa
咱們想要輸出這樣的所有組合,怎麼作呢?
首先 咱們定義一個res爲空,符合條件的組合都放在裏面,而後定義一個temp爲空,來存儲每次遍歷符合條件的一個字符串.code
過程是這樣的,首先
temp.push(a);
temp.push(d);
temp.push(g);
此時長度爲digits.length;把temp加到res裏面.
此時res=[‘adg’]
以後temp.pop()
temp.push(h)
長度爲digits.length;temp加到res裏面.
res =['adg', 'beh'];
temp.pop();
temp.push(i)
長度 == digits.length temp加到res裏面
res = [‘adg’, 'bdh', 'adi'];
.....
就照着這樣執行下去,而後就能遍歷完全部的組合.遞歸
不知道這樣講會不會清楚,若是不清楚,能夠留言,我會回覆的.圖片
var dict = { // 定義一個鍵盤的字典 "2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8":"tuv", "9":"wxyz" }; var letterCombinations = function(digits) { if (digits.length == 0) return []; var res = []; dfs(res, digits, 0, []); return res; }; var dfs = function(res, digits, index, temp) { 遞歸函數 if (temp.length == digits.length) { res.push(temp.join('')); return; } // dict[digits[index]]就是當前循環的數字對應的字符串. for (let i = 0; i < dict[digits[index]].length; i++) { temp.push(dict[digits[index]][i]); dfs(res, digits, index+1, temp); // index+1表明要循環下一個數字 temp.pop(); // 每次執行完當前的dfs以後,要pop一下,這樣才能繼續下一次循環 } }