边工作边刷题: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]
                
        

转载于:https://www.cnblogs.com/absolute/p/5677892.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值