给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
def letterCombinations(digits):
# 注意边界条件
if not digits:
return []
# 一个映射表,第二个位置是 "abc“,第三个位置是"def"。。。
# 这里也可以用map,用数组可以更节省点内存
d = [" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
# 最终输出结果的list
res = []
# 递归函数
def dfs(tmp,index):
# 递归的终止条件,注意这里的终止条件看上去跟动态演示图有些不同,主要是做了点优化
# 动态图中是每次截取字符串的一部分,"234",变成"23",再变成"3",最后变成"",这样性能不佳
# 而用index记录每次遍历到字符串的位置,这样性能更好
if index==len(digits):
res.append(tmp)
return
# 获取index位置的字符,假设输入的字符是"234"
# 第一次递归时index为0所以c=2,第二次index为1所以c=3,第三次c=4
# subString每次都会生成新的字符串,而index则是取当前的一个字符,所以效率更高一点
c = digits[index]
# map_string的下表是从0开始一直到9, ord(c)-48 是获取c的ASCII码然后-48,48是0的ASCII
# 比如c=2时候,2-'0',获取下标为2,letter_map[2]就是"abc"
letters = d[ord(c)-48]
# 遍历字符串,比如第一次得到的是2,页就是遍历"abc"
for i in letters:
# 调用下一层递归,用文字很难描述,请配合动态图理解
dfs(tmp+i,index+1)
dfs("",0)
print(res)
digits="23"
letterCombinations(digits)
def letterCombinations(digits):
if not digits:
return []
# 一个映射表,第二个位置是"abc“,第三个位置是"def"。。。
# 这里也可以用map,用数组可以更节省点内存
d = [" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
# 先往队列中加入一个空字符
res = [""]
for i in digits:
size = len(res)
# 由当前遍历到的字符,取字典表中查找对应的字符串
letters = d[int(i)]
# 计算出队列长度后,将队列中的每个元素挨个拿出来
for _ in range(0,size):
# 每次都从队列中拿出第一个元素
tmp = res.pop(0)
print(tmp)
# 然后跟"def"这样的字符串拼接,并再次放到队列中
for j in letters:
res.append(tmp+j)
print(res)
digits="2345"
letterCombinations(digits)