zoukankan      html  css  js  c++  java
  • 边工作边刷题: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]
                    
            
    
  • 相关阅读:
    阅读《构建之法》1-5章
    构建之法第8,9,10章
    实验5-封装与测试2
    第六次作业-my Backlog
    保存内容
    实验四-单元测试
    实验3—修改版
    做汉堡-57号
    实验3-2
    201306114357-实验3-C语言
  • 原文地址:https://www.cnblogs.com/absolute/p/5677892.html
Copyright © 2011-2022 走看看