1. 题目来源
2. 题目解析
方法一:dfs
很经典的一道 dfs
问题。一开始做 dfs
的时候,建议可以手动画下递归搜索树,便于帮助理解。数组来存储对应位置上的所有字符,暴搜即可。不必回溯,传的是 string
而不是引用,每层都是单独的 string
对象。
时间复杂度:
O
(
4
n
)
O(4^n)
O(4n)
空间复杂度:
O
(
n
)
O(n)
O(n)。递归调用栈的层数。
代码:
class Solution {
public:
vector<string> res;
string s[10] = {
"", "", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"
};
vector<string> letterCombinations(string digits) {
if (digits.empty()) return res;
dfs(digits, 0, "");
return res;
}
void dfs(string &digits, int u, string path) {
if (u == digits.size()) res.push_back(path);
else {
for (auto c : s[digits[u] - '0'])
dfs(digits, u + 1, path + c);
}
}
};