力扣_字符串7—交错字符串

这篇具有很好参考价值的文章主要介绍了力扣_字符串7—交错字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

给定三个字符串 s 1 、 s 2 、 s 3 s1、s2、s3 s1s2s3,请你帮忙验证 s 3 s3 s3 是否是由 s 1 s1 s1 s 2 s2 s2 交错 组成的。

两个字符串 s s s t t t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:文章来源地址https://www.toymoban.com/news/detail-828394.html

  • s = s 1 + s 2 + . . . + s n s = s1 + s2 + ... + sn s=s1+s2+...+sn
  • t = t 1 + t 2 + . . . + t m t = t1 + t2 + ... + tm t=t1+t2+...+tm
  • ∣ n − m ∣ < = 1 |n - m| <= 1 nm<=1
  • 交错 是 s 1 + t 1 + s 2 + t 2 + s 3 + t 3 + . . . s1 + t1 + s2 + t2 + s3 + t3 + ... s1+t1+s2+t2+s3+t3+... 或者 t 1 + s 1 + t 2 + s 2 + t 3 + s 3 + . . . t1 + s1 + t2 + s2 + t3 + s3 + ... t1+s1+t2+s2+t3+s3+...

方法

  • 动态规划
    • s 1 、 s 2 、 s 3 s1、s2、s3 s1s2s3 长度分别为 n 1 、 n 2 、 n n1、n2、n n1n2n
    • 定义 d p n 1 + 1 , n 2 + 2 dp_{n1+1,n2+2} dpn1+1,n2+2 数组, d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 s 3 s3 s3 i + j i+j i+j 个字符是否由 s 1 s1 s1 i i i 个字符和 s 2 s2 s2 j j j 个字符交错组成
    • s 3 [ i + j − 1 ] = = s 1 [ i − 1 ] s3[i+j-1] == s1[i-1] s3[i+j1]==s1[i1],则 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j]
    • s 3 [ i + j − 1 ] = = s 2 [ j − 1 ] s3[i+j-1] == s2[j-1] s3[i+j1]==s2[j1],则 d p [ i ] [ j ] = d p [ i ] [ j − 1 ] dp[i][j] = dp[i][j-1] dp[i][j]=dp[i][j1]
    • 空间复杂度优化:滚动数组
      • 定义 d p n 2 + 2 dp_{n2+2} dpn2+2 数组
      • d p [ j ] dp[j] dp[j] 上一次循环的值表示原来的 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]

代码

class Solution {
public:
    // bool isInterleave(string s1, string s2, string s3) {
    //     int n1 = s1.size();
    //     int n2 = s2.size();
    //     int n = s3.size();
    //     if(n1+n2 != n)
    //         return false;
    //     vector<vector<bool>> dp(n1+1, vector<bool>(n2+1));
    //     dp[0][0] = true;
    //     for(int i = 0; i <= n1; i++){
    //         for(int j = 0; j <= n2; j++){
    //             if(i > 0){
    //                 dp[i][j] = dp[i][j] || (dp[i-1][j] && s1[i-1] == s3[i+j-1]);
    //             }
    //             if(j > 0){
    //                 dp[i][j] = dp[i][j] || (dp[i][j-1] && s2[j-1] == s3[i+j-1]);
    //             }
    //         }
    //     }
    //     return dp[n1][n2];
    // }
    bool isInterleave(string s1, string s2, string s3) {
        int n1 = s1.size();
        int n2 = s2.size();
        int n = s3.size();
        if(n1+n2 != n)
            return false;
        vector<bool> dp(n2+1);
        dp[0] = true;
        for(int i = 0; i <= n1; i++){
            for(int j = 0; j <= n2; j++){
                if(i > 0){
                    dp[j] = (dp[j] && s1[i-1] == s3[i+j-1]);
                }
                if(j > 0){
                    dp[j] = dp[j] || (dp[j-1] && s2[j-1] == s3[i+j-1]);
                }
            }
        }
        return dp[n2];
    }
};

到了这里,关于力扣_字符串7—交错字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法学习——LeetCode力扣字符串篇

    344. 反转字符串 - 力扣(LeetCode) 描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 示例 1: 输入:s = [“h”,“e”,“l”

    2024年02月20日
    浏览(36)
  • 【算法】力扣【动态规划,LCS】1312. 让字符串成为回文串的最少插入次数

    1312. 让字符串成为回文串的最少插入次数 本文探讨的是力扣(LeetCode)上的第1312题:让字符串成为回文串的最少插入次数。这是一道属于动态规划类别下的困难题目,通常以回文串相关的操作来衡量算法的优化和执行效率。 问题的核心是给定一个字符串 s ,你可以在任意位

    2024年01月23日
    浏览(35)
  • 【算法思考记录】动态规划入门!力扣2606. 找到最大开销的子字符串【Python3、动态规划】

    原题链接 动态规划(Dynamic Programming,简称 DP)是一种通过将原问题分解为相互重叠的子问题并只解决一次的方法来解决问题的算法优化技术。动态规划通常用于优化递归问题,通过存储子问题的解来避免重复计算,从而显著提高算法的效率。 动态规划的基本思想是将原问题

    2024年02月03日
    浏览(28)
  • 算法学习——LeetCode力扣补充篇11(64. 最小路径和、48. 旋转图像 、169. 多数元素、394. 字符串解码、240. 搜索二维矩阵 II )

    64. 最小路径和 - 力扣(LeetCode) 描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→

    2024年04月23日
    浏览(32)
  • 【算法|动态规划No.28】leetcode1312. 让字符串成为回文串的最少插入次数

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月06日
    浏览(44)
  • 【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

    以下是能用KMP求解的算法题,KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 题目链接:28. 找出字符串中第一个匹配项的下标 题目内容: 题意还是很好理解的,要在字符串haystack中查找一个完整的needle,即字符串匹配。 暴力求解就是用 两层循环 :haystack从第

    2024年02月09日
    浏览(32)
  • 【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

    题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须 原地修改 输入数组,即不能新建一个数组来完成字符串的反转。我们注意到: 原来下标为0的,反转后是size - 1【原来下标是size - 1的,反转后是0】; 原来下标是1的,反转后是size - 2【原来下标是size -2的,反转后

    2024年02月11日
    浏览(34)
  • 有效的括号字符串(力扣)动态规划、贪心 JAVA

    给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是有效字符串返回true 。 有效字符串符合如下规则: 任何左括号 ‘(’ 必须有相应的右括号 ‘)’。 任何右括号 ‘)’ 必须有相应的左括号 ‘(’

    2024年02月14日
    浏览(27)
  • 【算法详解】力扣415.字符串相加

    力扣链接:力扣415.字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入:num1 = “11”, num2 = “123” 输出:

    2024年01月22日
    浏览(32)
  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套PythonJava双语代码, 2024.04.02 可通过leetcode所有测试用例。 目录 349. 两个数组的交集 解题思路 完整代码 Python Java 387. 字符串中的第一个唯一字符 解题思路 完整代码 Python Java

    2024年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包