(python)实现leetcode电话号码的字母组合

描述:

        给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

        给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

方法一:

        通过递归思想实现,递归的结束条件是nestdigit被读取完毕,长度为0,通过树遍历的方式去构造字符串到conbination,最后返回res。

        这个方法用时在30ms左右,创造的是字典,占据的空间和搜索的时间应该较第二种方法没那么快。


class Solution:
    def letterCombinations(self, digits: str) -> str:
        phone = {'2':'abc',
            '3':'def',
            '4':'ghi',
            '5':'jkl',
            '6':'mno',
            '7':'pqrs',
            '8':'tuv',
            '9':'wxyz'}
        res = []
        if not digits: return []
        def backtrack(conbination, nextdigit):
            if len(nextdigit) == 0:
                res.append(conbination)
            else:
                for letter in phone[nextdigit[0]]:
                    backtrack(conbination + letter,nextdigit[1:])
        backtrack('', digits)
        return res


if __name__=="__main__":
    solution=Solution()
    a = input("digits = ")
    print(solution.letterCombinations(a))

方法二:

        采用队列的方法来实现。先把第一个数字对应的字母放进队列中去,将队列头弹出来,依次遍历构造第二个数字对应的字符串,放在队列尾,以此类推。

       相较于第一种方法,由于创造的是链表,所以占据的空间并不大,运行时间也快



class Solution:
    def letterCombinations(self, digits: str):
        if not digits: return []
        phone = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
        queue = []
        for letter in phone[ord(digits[0]) - 50]:
            queue.append(letter)
        for digit in digits[1:]:
            for _ in range(len(queue)):
                tmp = queue.pop(0)
                for letter in phone[ord(digit)-50]:
                    queue.append(tmp+letter)
        return queue


if __name__ == "__main__":
    solution = Solution()
    a = input("digits = ")
    print(solution.letterCombinations(a))

你可能感兴趣的:(大数据)