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

Interleaving String

这题首先要问的是为什么需要dp呢?如果s1和s2中没有duplicate,那么每次的选择就是唯一的 。但是s1和s2要保持和s3中的order,如果有duplicate并任意选择匹配,另一个数组中可匹配的元素就会被重复元素block住。比如s1=“aa”,s2=“ab”,s3=“aaba"。

  • 注意这类涉及长度的dp都要从0开始,这个方便初始化
  • 这题可以把空间降为线性的,用rolling array的方法,因为从dependency graph来看,当前dp元素依赖于本层的前一个和上层的同一位置:本层的前一个已经计算好了,而上层的同一位置在当前元素后不再需要,可以被当前元素取代。很多2d dp都可以类似的方法减少空间。

错误点

  • s1的index为i-1,s2的index为j-1,那么对应的s3中的index为i+j-1,而不是i+j-2
class Solution(object):
    def isInterleave(self, s1, s2, s3):
        """
        :type s1: str
        :type s2: str
        :type s3: str
        :rtype: bool
        """
        n1=len(s1)
        n2=len(s2)
        n3=len(s3)
        if n1+n2!=n3: return False
        
        dp = [[False for j in range(n2+1)] for i in range(n1+1)]
        dp[0][0]=True
        for i in range(1, n1+1):
            dp[i][0]=(s1[i-1]==s3[i-1] and dp[i-1][0])
        
        for j in range(1, n2+1):
            dp[0][j]=(s2[j-1]==s3[j-1] and dp[0][j-1])
        
        for i in range(1, n1+1):
            for j in range(1, n2+1):
                dp[i][j]=((dp[i-1][j] and s3[i+j-1]==s1[i-1]) or 
                            dp[i][j-1] and s3[i+j-1]==s2[j-1])
                            
        return dp[n1][n2]
                
        
posted @ 2016-05-02 09:38  absolute100  阅读(73)  评论(0编辑  收藏  举报