給定一個(gè)僅包含數(shù)字2-9的字符串翎苫,返回所有它能表示的字母組合。答案可以按任意順序返回熙侍。
給出數(shù)字到字母的映射如下(與電話(huà)按鍵相同)欠橘。注意 1 不對(duì)應(yīng)任何字母帐姻。
示例 1:
輸入:digits = "23"輸出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
輸入:digits = ""輸出:[]
示例 3:
輸入:digits = "2"輸出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]是范圍['2', '9']的一個(gè)數(shù)字续滋。
解題思路:
(1)一共有幾個(gè)數(shù)字,每一組字符串的長(zhǎng)度就有多長(zhǎng)
(2)一個(gè)數(shù)字一個(gè)數(shù)字的疊加鞭达,可以畫(huà)出樹(shù)狀圖,樹(shù)狀圖一般可以用回溯來(lái)返回所有組合皇忿。
(3)回溯:先遞歸到一個(gè)組合的最底部畴蹭,逐層返回值。
本題采用傳遞一個(gè)容器引用鳍烁,在遞歸函數(shù)傳遞每次組合的結(jié)果(感覺(jué)有點(diǎn)想遞推下去的叨襟,有點(diǎn)不標(biāo)準(zhǔn))。在遞歸的最底時(shí)幔荒,直接將結(jié)果push_back()到容器里糊闽。
函數(shù)設(shè)計(jì):
void func(string current,string input,int num,vector<string> res):
??? {這里設(shè)置好數(shù)字與字母的鍵值對(duì)}
??? 如果num==input.length():??? res.push_back(current);
??? 否則:
??????? for (auto i : 鍵值對(duì)[input[num]-'0']):
????????????? string temp=current+i;
????????????? func(temp,input,num+1,res);
????void?func(string?d,string?current,int?num,vector<string>?&res){
????????vector<vector<char>>?data=
????????{
????????????{},
????????????{},
????????????{'a','b','c'},
????????????{'d','e','f'},
????????????{'g','h','i'},
????????????{'j','k','l'},
????????????{'m','n','o'},
????????????{'p','q','r','s'},
????????????{'t','u','v'},
????????????{'w','x','y','z'},
????????};
????????if?(d.length()==0)?{}
????????else?if?(num==d.length()){
????????????res.push_back(current);
????????}
????????else{
????????????for?(auto?i?:?data[d[num]-'0']){
????????????????string?temp="";
????????????????temp=temp+i;
????????????????temp=current+temp;
????????????????func(d,temp,num+1,res);
????????????}
????????}
????}
????vector<string>?letterCombinations(string?digits)?{
????????vector<string>?res;
????????func(digits,"",0,res);
????????return?res;
????}