前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 97. 交错字符串(DP)

LeetCode 97. 交错字符串(DP)

作者头像
Michael阿明
发布2020-07-13 15:15:11
3140
发布2020-07-13 15:15:11
举报

1. 题目

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

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

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/interleaving-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 交错组成:s1、s2 每个字符都要先从左边开始拿,次序随意,看能否组成 s3
  • dp[i][j] 表示 s1 取了 i 个,s2 取了 j 个,可以匹配 s3 前面的
  • 那么假设 dp[i][j] 已求出可以匹配,那么下一个状态就是取 s1 的第 i+1个(if s1[i] == s3[i+j]),或者取 s2 的第 j+1 个(if s2[j] == s3[i+j]
class Solution {	//C++
public:
    bool isInterleave(string s1, string s2, string s3) {
        if(s1.size()+s2.size() != s3.size())
        	return false;
        int m = s1.size(), n = s2.size(), i, j, k;
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        // dp[i][j] 表示 s1取了i个,s2取了 j 个,可以匹配s3前面的
        dp[0][0] = 1;
        for(i = 0; i < m; i++) 
        	if(s1[i] == s3[i])
        		dp[i+1][0] = 1;
            else
                break;
        for(i = 0; i < n; i++)
        	if(s2[i] == s3[i])
        		dp[0][i+1] = 1;
            else
                break;

        for(i = 1; i <= m; ++i)
        	for(j = 1; j <= n; j++)
        	{	//要求 i,j 状态,该状态下s3是第i+j个字符
        		k = i+j;
        		if(s1[i-1] == s3[k-1])//s1的第i个字符匹配
        			dp[i][j] |= dp[i-1][j];
    			if(s2[j-1] == s3[k-1])//s2的第j个字符匹配
    				dp[i][j] |= dp[i][j-1];
        	}
    	return dp[m][n];
    }
};

4 ms 6.9 MB

  • python3 解答
class Solution:
    def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
        m, n = len(s1), len(s2)
        if m+n != len(s3):
            return False;
        dp = [[0]*(n+1) for _ in range(m+1)]
        dp[0][0] = 1
        for i in range(m):
            if s1[i] == s3[i]:
                dp[i+1][0] = 1
            else:
                break
        for i in range(n):
            if s2[i] == s3[i]:
                dp[0][i+1] = 1
            else:
                break
        for i in range(1,m+1):
            for j in range(1,n+1):
                k = i+j
                if s1[i-1] == s3[k-1]:
                    dp[i][j] |= dp[i-1][j]
                if s2[j-1] == s3[k-1]:
                    dp[i][j] |= dp[i][j-1]
        return True if dp[m][n] else False

64 ms 13.5 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档