给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 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']
的一个数字。
思路
假设输入23
,如下图所示:
DFS需要一个边界条件来终止递归,这个边界条件是当前层数等于输入字符串(如23
)的长度时就终止递归。
在DFS时怎么遍历节点是一个问题。我们用一个vectir<string> candidate
向量来表示当前这一层需要遍历的字符串。string node
表示当前节点。string path
既表示当前已经遍历的节点,也起到类似visited
数组的作用。
代码
class Solution {
public:
void dfs(vector<string>& candidate, vector<string>& output_list, int level, string path, int top) {
// 1. Exit condition
if( level == top ) {
output_list.push_back( path );
return;
}
// 2. Walk every nodes that not visited
int len = candidate[level].size();
string node = candidate[level];
for(int i = 0; i < len; i++) {
path.push_back( node[i] );
dfs( candidate, output_list, level+1, path, top );
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
vector<string> output_list;
if( digits.size() <= 0 ) return output_list;
string path;
vector<string> keyboard = {
"",
"", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"
};
vector<string> candidate;
for(int i = 0; i < digits.size(); i++) {
candidate.push_back( keyboard[ digits[i]-'0' ] );
}
dfs(candidate, output_list, 0, path, digits.size());
return output_list;
}
};