DFS遍历,时间O(3^n),空间O(n)。
class Solution {
public:
const vector<string> keys = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> letterCombinations(string digits) {
string path;
vector<string> result;
dfs(digits, 0, path, result);
return result;
}
void dfs(string digits, int pos, string &path, vector<string> &result)
{
if(pos == digits.size())
{
result.push_back(path);
return;
}
int index = digits[pos]-'0';
for(int i=0; i<keys[index].size(); ++i)
{
path.push_back(keys[index][i]);
dfs(digits, pos+1, path, result);
path.pop_back();
}
}
};
迭代法。
class Solution {
public:
vector<string> letterCombinations(string digits) {
const vector<string> mapping{" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> result(1, "");
for(int k = 0; k < digits.size(); k++)
{
int idx = (digits[k] - '0');
int prev_size = result.size();
int next_size = mapping[idx].size();
result.resize(prev_size*next_size);
for(int i=0; i<next_size; i++)
copy(result.begin(), result.begin()+prev_size, result.begin()+prev_size*i);
for(int i=0; i<next_size; i++)
{
for(int j=0; j<prev_size; j++)
{
result[i*prev_size+j] += mapping[idx][i];
}
}
}
return result;
}
};