• LeetCode 97. 交错字符串 | Python


    97. 交错字符串


    题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/interleaving-string

    题目


    给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

    示例 1:

    输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
    输出: true
    

    示例 2:

    输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
    输出: false
    

    解题思路


    思路:动态规划

    在这里,我们使用 不同路径 这道题的思想去解决问题,向下向右去移动,求得是否存在这样的路径。

    那么这个问题就可以转换为求证,s3 是否能够从向下选取 s1,向右选取 s2,这样的形式,去求得是否存在 s3 这条路径。

    状态定义

    dp[i][j] 表示 s1 前 i 个字符和 s2 前 j 个字符能够拼接成 s3(i+j) 个字符,也就是当前路径存在。

    状态转移方程

    如果 s1 的第 i 个元素和 s3 的第 i+j 个元素相等,那么 dp[i][j] 是否成立,则需要看 dp[i-1][j] 是否成立,也就是这里需要看 s1 的前 i-1 个元素和 s2 的前 j 个元素能否拼接成 s3 的前 i+j-1 个元素。

    同样的 如果 s2 的第 j 个元素和 s3 的第 i+j 个元素相等,此时 dp[i][j] 是否成立,则需要看 dp[i][j-1] 是否成立,也就是需要看 s2 的前 i 个元素和 s2 的前 j-1 个元素是否能够拼接成 s3 的前 i+j-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])

    状态初始化

    • dp[0][0] = True
    • 如果 j = 0, dp[i][0] 是否成立,取决于 dp[i-1][0] 以及 s1 的第 i 个字符是否等于 s3 的第 i 个字符;
    • 如果 i = 0, dp[0][j] 是否成立,取决于 dp[0][j-1] 以及 s3 的第 i 个字符与 s2 的第 i 个字符是否相等。

    具体的实现代码如下。

    代码实现


    class Solution:
        def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
            # 先处理特殊情况,如果 s1 和 s2 的长度和不等于 s3 的长度,则返回 False。因为无法交错拼接
            if len(s1) + len(s2) != len(s3):
                return False
            
            m = len(s1)
            n = len(s2)
    
            # 状态定义
            dp = [[False] * (n+1) for _ in range(m+1)]
            # 初始化
            dp[0][0] = True
            for i in range(1, m+1):
                dp[i][0] = dp[i-1][0] and s3[i-1] == s1[i-1]
            for j in range(1, n+1):
                dp[0][j] = dp[0][j-1] and s3[j-1] == s2[j-1]
    
            for i in range(1, m+1):
                for j in range(1, n+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[-1][-1]
    

    实现结果


    实现结果

    欢迎关注


    公众号 【书所集录

  • 相关阅读:
    存储过程与事务实现转账
    win7创建虚拟无线网络
    .net制作安装包 如何生成快捷方式
    安装EFCodeFirst失败。。。。
    用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
    Java struts2
    Java spring
    Java web
    传输层
    xml
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13337528.html
Copyright © 2020-2023  润新知