Leetcode第17題 Letter Combinations of a Phone Number

題目

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一下,這樣才能繼續下一次循環
    } 
}
相關文章
相關標籤/搜索