题目地址:
https://leetcode.com/problems/letter-combinations-of-a-phone-number/
给定一个由数字组成的字符串,返回其在电话号码盘上代表的所有字符串。
DFS。只需要遵循,做当前的选择,枚举下一个选择,撤销当前的选择,这样的步骤。同时注意一下枚举结束的条件。此问题枚举结束当且仅当枚举到digits最后一位。代码如下:
class Solution {
public:
vector<string> letterCombinations(string digits) {
static vector<string> ss{"abc", "def", "ghi", "jkl",
"mno", "pqrs", "tuv", "wxyz"};
vector<string> res;
if (digits.empty()) return res;
string s;
dfs(0, s, digits, res, ss);
return res;
}
void dfs(int u, string& s, string& ds, vector<string>& res,
vector<string>& ss) {
if (u == ds.size()) {
res.push_back(s);
return;
}
for (char ch : ss[ds[u] - '2']) {
s += ch;
dfs(u + 1, s, ds, res, ss);
s.pop_back();
}
}
};
时间复杂度
O
(
n
3
n
)
O(n3^n)
O(n3n)(生成最多
3
n
3^n
3n种排列,每个排列需要
O
(
n
)
O(n)
O(n)的时间加进res里),空间
O
(
n
)
O(n)
O(n)(递归栈深度,同时也是s
的最长长度)。