Leetcode17:电话号码的字母组合

 给定一个仅包含数字 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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值