边工作边刷题:70天一遍leetcode: day 38-1

Letter Combinations of a Phone Number

这题iterate方法的基本思路就是连续做+1,+1的含义就是移动同一数字对应字母下一个index处。算法是两层循环,外层是每一个输出,内层是一个数的每一位。难点是循环的invariant:外层是carry!=1,因为如果内层循环最高位仍有进位说明已经过了最后一个对应string。内层从低到高遍历每一位,但如果carry变为0,要break中止。

错误点

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        def getOneRes(indices):
            res = []
            for i in range(len(indices)):
                res.append(dmap[ord(digits[i])-ord('0')][indices[i]])
            return ''.join(res)
        
        if not digits: return []
        dmap = ["", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
        indices = [0]*len(digits)
        carry = 0
        res = []
        while not carry:
            res.append(getOneRes(indices))
            for i in range(len(digits)-1, -1, -1):
                indices[i] += 1
                if indices[i]==len(dmap[ord(digits[i])-ord('0')]):
                    indices[i]=0
                    carry=1
                else:
                    carry=0
                    break
            
        
        return res
posted @ 2016-04-09 12:03  absolute100  阅读(107)  评论(0编辑  收藏  举报