题目
给定一个仅包含数字 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']
的一个数字。
思路
算法:
DFS算法 O(4n)
- 1、先把数字和字符对应在一个哈希表中
- 2、
dfs(String digits,int u,String path)
:path
表示当前已经有什么元素,u
表示枚举到digitis
的第u
个字母,从哈希表中找到第u
个字母对应的几个字符,分别进行枚举拼接到path
后面
时间复杂度:一个数字最多有 4 种情况,假设有 n 个数字,因此 4n 种情况是一个上限,因此时间复杂度是 O(4n) .
代码
C++代码:
class Solution {
public:
vector<string> ans;
string strs[10] = {
"", "", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz",
};
vector<string> letterCombinations(string digits) {
if (digits.empty()) return ans;
dfs(digits, 0, "");
return ans;
}
void dfs(string& digits, int u, string path) {
if (u == digits.size()) ans.push_back(path);
else {
for (auto c : strs[digits[u] - '0'])
dfs(digits, u + 1, path + c);
}
}
};
python3代码:
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
m = {}
m['2'] = "abc"
m['3'] = "def"
m['4'] = "ghi"
m['5'] = "jkl"
m['6'] = "mno"
m['7'] = "pqrs"
m['8'] = "tuv"
m['9'] = "wxyz"
res = []
if not digits:
return []
def dsf(temp: str, index: int):
if index == len(digits):
res.append(temp)
return res
for c in m[digits[index]]:
dsf(temp+c, index+1)
dsf("", 0)
return res