leetcode-17-電話號碼的字母組合
阿新 • • 發佈:2018-08-12
又是 數字 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-電話號碼的字母組合