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]
                    
            
    
  • 相关阅读:
    LF will be replaced by CRLF in package.json.
    JS 防抖和节流
    webpack依赖分析|打包优化
    JavaScript 中精度问题以及解决方案
    mysql查询某些数据的最小值
    mongodb sort
    常用的快捷键(用到时再不断完善)
    一、negut增加Nancy,和Nancy.Hosting.Self,
    Linux系统(Centos)安装tomcat和部署Web项目
    CentOS 7系统安装jdk-8u161-linux-x64.tar.gz
  • 原文地址:https://www.cnblogs.com/absolute/p/5677892.html
Copyright © 2011-2022 走看看