目录
题目描述:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解决思路:
- 每次结合两个数字,比如输入是234,先以2开始,则ans=["a","b", "c"] ;
- 然后2, 3结合,ans = ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"];
- 然后23和4结合。
C++代码:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.4 MB, 在所有 C++ 提交中击败了52.85%的用户
class Solution {
public:
vector<string> letterCombinations(string digits) {
//
if (digits.size() == 0) return {};
// 仅包含数字 2-9 的字符串
map<char, string> num_string_map;
num_string_map.insert(pair<char, string>('2', "abc"));
num_string_map.insert(pair<char, string>('3', "def"));
num_string_map.insert(pair<char, string>('4', "ghi"));
num_string_map.insert(pair<char, string>('5', "jkl"));
num_string_map.insert(pair<char, string>('6', "mno"));
num_string_map.insert(pair<char, string>('7', "pqrs"));
num_string_map.insert(pair<char, string>('8', "tuv"));
num_string_map.insert(pair<char, string>('9', "wxyz"));
// 遍历字符串 "234"
// 注意一个数字只能是对应取一个字母,从第一个数字开始依次和后面的数字结合
// 比如23先结合,再23和4结合
vector<string> ans; // 赋初始值,即第一个数字所对应的所有字母.
for (int i = 0; i < num_string_map[digits[0]].size(); i++)
{
string x(1, num_string_map[digits[0]][i]);
ans.push_back(x);
}
for (int i = 1; i < digits.size(); i++) // 一次加一个,依次添加后面的数字
{
string cur_string = num_string_map[digits[i]];
vector<string> tmp; // 中间结果
for (int j = 0; j < ans.size(); j++) // 遍历ans中的上一次结果,依次和当前数字i对应的所有个字母结合
{
for (int m = 0; m < cur_string.size(); m++) tmp.push_back(ans[j] + cur_string[m]);
}
// 2和3结合后, tmp={"ad", "ae", "af", "bd", "be", ...}
// 更新ans
ans = tmp;
// 然后继续添加后面的数字。
}
return ans;
}
};
python代码:
执行用时:12 ms, 在所有 Python 提交中击败了91.38%的用户
内存消耗:13 MB, 在所有 Python 提交中击败了84.06%的用户
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
#
if len(digits) == 0: return []
# 哈希表,数字只有2-9
num_string_map = {
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz"
}
# 遍历数字,依次将后面的数字与前面(ans)结合
# 比如数字串234
ans = []
cur_string = num_string_map[digits[0]]
[ans.append(cur_string[i]) for i in range(len(cur_string))] # 初始值是["a", "b", "c"]
for i in range(1, len(digits)): # 依次将后面的数字与前面(ans)结合
cur_string = num_string_map[digits[i]] # 当前数字所对应的所有字母,需要结合到ans中
tmp = []
for j in range(len(ans)): # 遍历当前的ans,依次将每一个字符串j与当前i所有的字母m结合
for m in range(len(cur_string)):
tmp.append(ans[j]+cur_string[m])
ans = tmp # 更新ans
return ans