leetcode--17 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:回溯法
具体代码:
string gloLetterArr = "abcdefghijklmnopqrstuvwxyz";
void dfs17(string digits, int letterNum, int nLength, int idx, vector<string>& oneresult, vector<string>& result)
{
if (idx == nLength)
{
string temp;
for (int i = 0; i < oneresult.size(); ++i)
{
temp += oneresult[i];
}
result.push_back(temp);
return;
}
int index[] = {0, 3, 6, 9, 12, 15, 19, 22};
int digit = digits[0] - '0';
int letterNumNext = 3;
if (digits[1] == '7' || digits[1] == '9')
{
letterNumNext = 4;
}
for (int i = 0; i < letterNum; i++)
{
oneresult.push_back(gloLetterArr.substr(index[digit - 2] + i, 1));
dfs17(digits.substr(1), letterNumNext, nLength, idx + 1, oneresult, result);
oneresult.pop_back();
}
}
vector<string> leetcode_array::letterCombinations(string digits)
{
vector<string> result;
vector<string> oneresult;
int n = digits.size();
if (n == 0)
{
return result;
}
if (digits[0] != '9' && digits[0] != '7')
{
dfs17(digits, 3,n, 0, oneresult, result);
}
else
{
dfs17(digits, 4,n, 0, oneresult, result);
}
return result;
}
实际上可采用hash+dfs方法,以提高速度
class Solution {
public:
void dfs17(string digits, int nLength, int idx,
unordered_map<char, string>& table,
string& oneresult, vector<string>& result)
{
if (idx == nLength)
{
result.push_back(oneresult);
return;
}
string target = table[digits[0]];
for (int i = 0; i < target.size(); i++)
{
oneresult += target.substr(i, 1);
dfs17(digits.substr(1), nLength, idx + 1, table, oneresult, result);
oneresult.pop_back();
}
}
vector<string> letterCombinations(string digits)
{
vector<string> result;
string oneresult;
int n = digits.size();
if (n == 0)
{
return result;
}
unordered_map<char, string> table{
{ '2', "abc" },{ '3', "def" },{ '4', "ghi" },
{ '5', "jkl" },{ '6', "mno" },{ '7', "pqrs" },
{ '8', "tuv" },{ '9', "wxyz"}};
dfs17(digits,n, 0, table, oneresult, result);
return result;
}
};