前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 97 Interleaving String (动态规划)

LeetCode 97 Interleaving String (动态规划)

作者头像
ShenduCC
发布2020-02-13 12:50:36
3600
发布2020-02-13 12:50:36
举报
文章被收录于专栏:算法修养

题目

题意:

给你三个字符串s1,s2,s3 问你s3是否由s1和s2互相交叉组成。也就是说s3中的某个子序列是s1,剩下的字符串组成s2。

第一眼感觉是最长公共子序列,一开始的想法是先把s3和s1求最长公共子序列,然后从s3的部分中把s1抠出来,在再和s2求最长公共子序列。

但是这种做法很麻烦,而且是错误的。

正确的思路和最长公共子序列有点相似。

dp[i][j][k] = 1 表示从0-i 的s3区间是由 0-j的s1区间和0-k的s2区间组合而来的。

状态转移方程也很简单。

代码语言:javascript
复制
class Solution {
public:
    

    bool isInterleave(string s1, string s2, string s3) {
    
    int dp[s3.size()+1][s1.size()+1][s2.size()+1];
    memset(dp,0,sizeof(dp));
    dp[0][0][0]=1;

    for(int i=1;i<=s3.size();i++)
    {
        for(int j=0;j<=s1.size();j++)
        {
            for(int k=0;k<=s2.size();k++)
            {
                if(j!=0 && s3[i-1]==s1[j-1]) {

                    if (dp[i-1][j-1][k]==1)
                        dp[i][j][k] = 1;
                }

                if(k!=0 && s3[i-1]==s2[k-1])
                {
                    if(dp[i-1][j][k-1]==1)
                        dp[i][j][k]=1;

                }
            }

        }

    }

    if(dp[s3.size()][s1.size()][s2.size()]==1)
        return true;
    
    else
        return false;

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

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

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

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

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