(力扣每日一题)交错字符串

本文介绍了解决力扣每日一题——交错字符串问题的动态规划方法。通过建立dp数组,根据状态转移方程判断s1和s2是否能交错组成s3。时间复杂度和空间复杂度均为O(mn),其中m和n分别是s1和s2的长度。
摘要由CSDN通过智能技术生成

交错字符串

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
在这里插入图片描述

解题思路
动态规划(来源力扣)
(1)开数组
我们使用dp[i][j]表示s1的前i个字符和s2的前j个字符是否能构成s3的前i+j个字符。
首先,dp[0][0]一定是True。
(2)初始化
1、初始化s1,s2,s3的长度分别为len1,len2,len3
2、若len1+len2!=len3,表示一定不能构成交错字符串,返回False
3、初始化dp为(len1+1)*(len2+1)的False数组。
(3)状态转移方程
1、初始化第一列dp[i][0],遍历第一列,遍历区间[1,len1+1):
dp[i][0]=dp[i-1][0] and s1[i-1]==s3[i-1]
表示s1的前i位是否能构成s3的前i位。因此需要满足的条件为,前i-1位可以构成s3的前i-1位,且s1的第i位(s1[i-1])等于s3的第i位(s3[i-1])

2、初始化第一行dp[0][j],遍历第一行,遍历区间[1,len2+1):
dp[0][i]=dp[0][i-1] and s2[i-1]==s3[i-1]
表示s2的前ii位是否能构成s3的前ii位。因此需要满足的条件为,前i−1位可以构成s3的前i−1位且s2的第i位(s2[i−1])等于s3的第i位(s3[i-1])

3、遍历dp数组,每一行i,遍历区间[1,len1+1):每一列j,遍历区间[1,len2+1):
dp[i][j]=(dp[i][j-1] and s2[j-1]==s3[i+j-1]) or (dp[i-1][j] and s1[i-1]==s3[i+j-1])
解释:s1前i位和s2的前j位能否组成s3的前i+j位取决于两种情况:
s1的前i个字符和s2的前j-1个字符能否构成s3的前i+j-1位,且s2的第j位(s2[j-1])是否等于s3的第i+j位(s3[i+j-1])。

(4)、返回dp[-1][-1]

class Solution:
    def isInterleave(self, s1: str, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值