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

交错字符串

作者头像
你的益达
发布2020-08-05 14:34:16
4920
发布2020-08-05 14:34:16
举报

问题描述:

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

代码语言:javascript
复制
示例 1:

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

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

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

解决方案

首先得判断s1与s2的长度之和是否等于s3的长度,若不相等则s1和s2怎么组合都不可能匹配出s3。

该问题可以转化为每次从s1或者s2中顺序取一个元素,最终直到s1, s2取完若能够组成s3,则认为s3可以由s1, s2交错组成。我们的每步操作只要选择s1或者s2即可。

定义dp[i] [j] 为s1从i开始,s2从j开始能否匹配上s3。

转移方程:

dp[i][j] = (s1[i]==s3[i + j]\quad and \quad dp[i + 1][j])\quad or\quad (s2[j]==s3[i + j]\quad and \quad dp[i][j+1])

若s1的当前元素等于s3的当前元素,判断从s1的下一个元素和s2当前元素开始能否匹配上s3的下一个元素开始的字符串,若能匹配上,则当前位置选择s1可以完成匹配;

若s2的当前元素等于s3的当前元素,判断从s2的下一个元素和s1当前元素开始能否匹配上s3的下一个元素开始的字符串,若能匹配上,则当前位置选择s2可以完成匹配;

否则就不能完成匹配。

baseline:

dp[M][N] = true\\\dp[i][N] = s1[i]==s3[i+N] and dp[i+1][N], \quad i \in[0,M-1]\\\dp[M][j] = s2[j]==s3[j+M] and dp[M][j+1], \quad j \in[0,N-1]

上式中,M为s1的长度,N为s2的长度。

第一个式子s1,s2都用完了,s3也完了,返回true

第二个式子时s2用完了,s1还有,此时需要判断s1剩下的元素能否与s3剩下的元素完成匹配

第二个式子时s1用完了,s2还有,此时需要判断s2剩下的元素能否与s3剩下的元素完成匹配

代码如下:

代码语言:javascript
复制
class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1.length() + s2.length() != s3.length()){
            return false;
        }
        int M = s1.length();
        int N = s2.length();
        // dp[i][j] 为s1从i开始,s2从j开始能否匹配上 s3从i + j开始
        boolean[][] dp = new boolean[M + 1][N + 1];
        // init
        dp[M][N] = true;
        // s2没了 
        for(int i = M - 1; i >= 0; i--){
            if(s1.charAt(i) == s3.charAt(N + i)){
                dp[i][N] = true;
            }else{
                break;
            }
        }
        for(int j = N - 1; j >= 0; j--){
            if(s2.charAt(j) == s3.charAt(M + j)){
                dp[M][j] = true;
            }else{
                break;
            }
        }

        for(int i = M - 1; i >= 0; i--){
            for(int j = N - 1; j >= 0; j--){
                dp[i][j] = (s1.charAt(i) == s3.charAt(i + j) && dp[i + 1][j]) || (s2.charAt(j) == s3.charAt(i + j) && dp[i][j + 1]);
            }
        }
        return dp[0][0];

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

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

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

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

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