leetcode 17题 (电话号码对应的字符组合)

569 阅读1分钟

给定一个只包含2-9的数字串,给出这个数字串可能的字符组合

转换规则:九宫格键盘上,每个数字都对应几个字符,找出所有能对应给定数字串的字符组合


例:

输入 :‘23’

输出 : ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]


解法1 (递归法):

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        
        if not digits:
            return []
        
        def func_help(results, digits):
            print(digits)
            m_result = []
            for member in results:
                for c in digits:
                    m_result.append(member + c)
            return m_result
        
        digit_map = {'2':'abc',
                     '3':'def',
                     '4':'ghi',
                     '5':'jkl',
                     '6':'mno',
                     '7':'pqrs',
                     '8':'tuv',
                     '9':'wxyz'}
        result = ['']
        
        for n in digits:
            if n in digit_map:
                result = func_help(result, digit_map[n])
                
        return result
                


解法2:(利用python内建的itertools.product函数(求笛卡尔积))

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []
        from itertools import product
        
        digit_map = {'2':'abc',
                     '3':'def',
                     '4':'ghi',
                     '5':'jkl',
                     '6':'mno',
                     '7':'pqrs',
                     '8':'tuv',
                     '9':'wxyz'}
        
        kw_result = [digit_map[i] for i in digits]
        
        result = [ ''.join(v) for v in product(*kw_result)]
        
        return result