給定一個數字字符串,返回所有這些數字可以表示的字母組合。
一個數字到字母的映射(就像電話按鈕)如下圖所示。
輸入:數字字符串“23”
輸出:[ad, ae, af, bd, be, bf, cd, ce, cf]
備注:盡管以上答案是無序的,如果你想的話你的答案可以是有序的。
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.
Input:Digit string 23
Output: [ad, ae, af, bd, be, bf, cd, ce, cf].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
看樣子我還是用C#順手點,一氣呵成……主要是用遞歸,因為不知道
public class Solution
{
IList list = new List();
public Solution()
{
list.Insert(0, abc);
list.Insert(1, def);
list.Insert(2, ghi);
list.Insert(3, jkl);
list.Insert(4, mno);
list.Insert(5, pqrs);
list.Insert(6, tuv);
list.Insert(7, wxyz);
}
public IList LetterCombinations(string digits)
{
IList result = new List();
if (digits.Length == 0)
return result;
if (digits.Length == 1)
{
foreach (var a in list.ElementAt(int.Parse(digits[0].ToString()) - 2))
{
result.Insert(0, a.ToString());
}
}
int count = 0;
IList temp = LetterCombinations(digits.Substring(1, digits.Length - 1));
foreach (var a in list.ElementAt(int.Parse(digits[0].ToString()) - 2))
{
foreach (var rest in temp)
{
result.Insert(count++, a.ToString() + rest);
}
}
return result;
}
}
以下是復制來的一段C++代碼,坦白地說,我寫不出來這樣的C++代碼……
class Solution {
public:
vector letterCombinations(string digits) {
vector ans;
if(digits.size() == 0)
return ans;
int depth = digits.size();
string tmp(depth, 0);
dfs(tmp, 0, depth, ans, digits);
return ans;
}
void dfs(string &tmp, int curdep, int depth, vector &ans, string &digits){
if(curdep >= depth){
ans.push_back(tmp);
return ;
}
for(int i = 0; i < dic[digits[curdep] - '0'].size(); ++ i){
tmp[curdep] = dic[digits[curdep] - '0'][i];
dfs(tmp, curdep + 1, depth, ans, digits);
}
return ;
}
private:
string dic[10] = {{},{},{abc},{def},{ghi},{jkl},{mno},{pqrs},{tuv},{wxyz}};
};