1. 程式人生 > >leetcode-17-電話號碼的字母組合

leetcode-17-電話號碼的字母組合

又是 數字 ref gui leet cpp 表示 說明 let

題目描述:

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。

技術分享圖片

示例:

輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

說明:
盡管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。

要完成的函數:

vector<string> letterCombinations(string digits)

說明:

1、這道題給定一個字符串digits,裏面存放著2-9的數字的組合,要求按照上述圖片中的數字字母對應情況,列出所有可能的組合。

所有可能的組合情況存儲在vector中,最後返回vector。

2、這道題明白題意之後,就知道又是類似於上次leetcode-22-括號生成的題目。

同樣的思路,同樣的解決方法,都是采用深度優先去讀取樹的方法。

每個數字對應3種字母,下一個數字繼續對應3種字母,就像開枝散葉一般,從三種情況擴展到9種情況。

所以我們只需要深度優先去讀取這棵樹,最後把所有可能的組合存儲在vector中。

但我們不需要真的在代碼中建樹,我們用遞歸的方法來實現深度優先搜索,去讀取數值,就好了。

代碼如下:(附詳解)

string res1="";//全局變量,每種對應情況的字符串
    vector<string
>res;//全局變量,最終要返回的vector void digui(string digits,string res1)//自己寫的遞歸函數 { if(digits=="")//最終退出遞歸的條件 { res.push_back(res1);這時候digits空了,我們把得到的res1存入vector中,退出遞歸 } else//正常情況下,我們進入else這部分的處理 { if(digits[0]==2)//如果首位是2 { digui(digits.substr(
1,digits.size()-1),res1+"a");
          //那麽取digits的第二位開始一直到最後一位,res1加上“a”,進入遞歸 digui(digits.substr(1,digits.size()-1),res1+"b");
          //前一行的遞歸完成後,進入這一行的遞歸,digits這時候仍然是初始的digits,
          //我們同樣要取第二位到最後一位的digits,res1仍然是初始的res1,同樣要res1加上“b” digui(digits.substr(1,digits.size()-1),res1+"c");//相同的處理 } else if(digits[0]==3)//如果首位是3,同樣的處理 { digui(digits.substr(1,digits.size()-1),res1+"d"); digui(digits.substr(1,digits.size()-1),res1+"e"); digui(digits.substr(1,digits.size()-1),res1+"f"); } else if(digits[0]==4) { digui(digits.substr(1,digits.size()-1),res1+"g"); digui(digits.substr(1,digits.size()-1),res1+"h"); digui(digits.substr(1,digits.size()-1),res1+"i"); } else if(digits[0]==5) { digui(digits.substr(1,digits.size()-1),res1+"j"); digui(digits.substr(1,digits.size()-1),res1+"k"); digui(digits.substr(1,digits.size()-1),res1+"l"); } else if(digits[0]==6) { digui(digits.substr(1,digits.size()-1),res1+"m"); digui(digits.substr(1,digits.size()-1),res1+"n"); digui(digits.substr(1,digits.size()-1),res1+"o"); } else if(digits[0]==7) { digui(digits.substr(1,digits.size()-1),res1+"p"); digui(digits.substr(1,digits.size()-1),res1+"q"); digui(digits.substr(1,digits.size()-1),res1+"r"); digui(digits.substr(1,digits.size()-1),res1+"s"); } else if(digits[0]==8) { digui(digits.substr(1,digits.size()-1),res1+"t"); digui(digits.substr(1,digits.size()-1),res1+"u"); digui(digits.substr(1,digits.size()-1),res1+"v"); } else if(digits[0]==9) { digui(digits.substr(1,digits.size()-1),res1+"w"); digui(digits.substr(1,digits.size()-1),res1+"x"); digui(digits.substr(1,digits.size()-1),res1+"y"); digui(digits.substr(1,digits.size()-1),res1+"z"); } } } vector<string> letterCombinations(string digits) { if(digits=="")//邊界情況處理,返回一個空的vector return res; digui(digits,res1);//進入遞歸處理,深度優先讀取樹 return res;//最終返回vector }

上述代碼思路清晰,明白了這種思路,以後這類題目都相當容易。

上述代碼實測0ms,beats 100.00% of cpp submissions。

leetcode-17-電話號碼的字母組合