97. 交错字符串

news2024/12/23 22:20:07

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

解题思路:动态规划。

  1. 如果s1.length()+s2.length != s3.length(),直接返回false,否则使用动态规划求解。
  2. 定义状态:dp[i][i],表示s3的前i+j个字符是否由 s1的前 i 和字符和s2的前j个字符交错组成
  3. 初始状态:dp[0][0],显然当s1,s2,s3都为空时,dp[0][0]=true
  4. 状态转移:对于dp[i][j]:判断 s 的第 i+j 个字符即 s[i + j -1]是由 s1[i-1] 匹配还是 s2[j-1] 匹配(索引从开始) 
    1. 如果 i >0:如果由s1[i-1]匹配,即 s3[i + j -1] == s1[ i-1] 并且 dp[i-1][j] = true时,dp[i][j] = true
    2. 如果 j >0:如果由s2[j-1]匹配,即 s3[i + j -1] == s2[ j-1] 并且 dp[i][j-1] = true时,dp[i][j] = true
  5. 因为可以连续使用s1中的字符进行匹配,也可以连续使用s2中的字符进行匹配,索引对于 dp[i][j]的求解,需要从0开始从前往后进行遍历,只要有一个符合,dp[i][j] = true

AC代码

class Solution {
   public static boolean isInterleave(String s1, String s2, String s3) {
        if (s1.length() + s2.length() != s3.length()) {
            return false;
        }
        if (s1.length() == 0 || s2.length() == 0) {
            return s3.equals(s1) || s3.equals(s2);
        }
        boolean[][] dp = new boolean[s1.length() + 1][s2.length() + 1];
        dp[0][0]=true;
        for (int i = 0; i <= s1.length(); i++) {
            for (int j = 0; j <= s2.length(); j++) {
                if (i > 0) {
                    dp[i][j] |= dp[i - 1][j] && s1.charAt(i-1) == s3.charAt(i + j - 1);
                }
                if (j > 0) {
                    dp[i][j] |= dp[i][j - 1] && s2.charAt(j-1) == s3.charAt(i + j - 1);
                }
            }
        }
        return dp[s1.length()][s2.length()];
    }
}

 

上述空间复杂度为O(mn),可以进行空间优化

 求解dp[i][j]时,会使用到 dp[i-1][j]和 dp[i][j-1],即状态dp[i][j]只与dp[i-1][j] 和 dp[i][j-1]有关,如下图所示:

可以使用一维数组进行空间优化,对于 dp[i][j]的更新是从上往下,从左往右进行更新的,最终需要的结果右下角的值,所以可以使用一维数组 dp[i]进行保存每一行的结果:

  1. 初始时dp[i]保存第一行每一列的结果
  2. 求解第二行时,在更新前,dp[i]就是 dp[i][j-1],dp[i-1]就是dp[i-1][j],所以对于dp[i]的求解就变为:
    1. 当 i >0时,dp[ j ] = dp[j] && s1.charAt(i-1)==s3.charAt(i+j-1)
    2. 当 j > 0时,dp[ j ] |= dp[ j-1 ] && s2.charAt(j-1) == s3.charAt(i+j-1) 

AC代码

class Solution {
   public static boolean isInterleave(String s1, String s2, String s3) {
        if (s1.length() + s2.length() != s3.length()) {
            return false;
        }
        if (s1.length() == 0 || s2.length() == 0) {
            return s3.equals(s1) || s3.equals(s2);
        }
        boolean[]dp = new boolean[s2.length() + 1];
        dp[0]=true;
        for (int i = 0; i <= s1.length(); i++) {
            for (int j = 0; j <= s2.length(); j++) {
                if (i > 0) {
                    dp[j] = dp[j] && s1.charAt(i-1) == s3.charAt(i + j - 1);
                }
                if (j > 0) {
                    dp[j] |= dp[j - 1] && s2.charAt(j-1) == s3.charAt(i + j - 1);
                }
            }
        }
        return dp[s2.length()];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在CPU上运行yolov5

https://blog.csdn.net/weixin_54721509/article/details/122983561 前提是安装好了 python和 opencv基本环境 &#xff0c;如果没按转可以参考&#xff1a;https://blog.csdn.net/yangshengwei230612/article/details/127606771 安装pytorch 进入pytorch官网 https://pytor…

No175.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

SOLIDWORKS PDM 2024数据管理5大新功能

1. 改进的视觉内容 • 通过装配体可视化功能&#xff0c;在 SOLIDWORKS 中以图形方式查看零部件数据&#xff0c;如工作流程状态。• 使用特定图标迅速识别焊件切割清单零部件。 优点&#xff1a;重要数据和系统信息一目了然。 2.增强的数据保护和跟踪功能 •保护“包含”和…

D-LINK SQL注入漏洞让攻击者获得管理员权限

D-Link DAR-7000 设备中发现了一个名为 SQL 注入的安全漏洞。 SQL注入是一种恶意攻击&#xff0c;它利用Web应用程序中的漏洞注入恶意SQL语句并获得对数据库的未经授权的访问。 此技术允许攻击者查看、修改和删除数据库中的数据&#xff0c;这可能对数据的机密性、完整性和可…

leetcode经典面试150题---4.删除有序数组中的重复项II

目录 题目描述 前置知识 代码 方法一 双指针 思路 图解 实现 复杂度 题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&…

YouTube博主数据信息资源

YouTube博主数据信息资源 &#x1f525;我是一位拥有10年编程经验的程序猿&#xff0c;为你带来一个全新的优质资源 &#x1f50d;您是否在寻找最新、最活跃的YouTube博主数据&#xff0c;以助力你的项目、营销或研究&#xff1f; 我们的数据&#xff0c;您的优势&#xff1a;…

【《数据库系统原理》学习笔记-第1章】

数据库系统概述 概述基本概念数据数据库数据库管理系统数据库系统 管理发展『人工管理阶段』『文件系统阶段』『数据库系统阶段』 主页传送门&#xff1a;&#x1f4c0; 传送 概述 数据库系统原理课程是一门理论与实践相结合的课程&#xff0c;通过大数据技术、数据保护、关系…

【Leetcode】【每日一题】【中等】274. H 指数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/h-index/description/?envTyped…

云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

南京长江大桥是中国第一座自主设计建造的双层公路铁路桥&#xff0c;也是世界上最早的双层公路铁路桥之一。它不仅是一座桥梁&#xff0c;更是一座历史文化的见证者和传承者。它见证了中国人民的智慧和奋斗&#xff0c;承载了中国社会的变迁和发展。 如何让这座不可移动的文物…

【Android】Android Framework系列---CarPower电源管理

Android Framework系列—CarPower电源管理 智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。这些系统需要由汽车电源进行供电。由于汽车自身的特殊供电环境&#xff08;相比手机方便的充电环境&#xff0c;汽车的蓄电池如果没有电是需要专业人士操作…

这个第一个输出为啥是2 不是4 啊?

#include <iostream> using namespace std;class Point{ public:int x;int y;Point(int x1, int y1) : x(x1), y(y1) //成员初始化列表{ }int getDistance() {return x * x y * y;} };void changePoint1(Point point) //使用对象作为函数参数 {point.x 1;point.y -…

上海高考英语科目命题趋势和备考建议,附1990-2023真题解析

英语和语文一样&#xff0c;都是侧重语言的阅读理解、交流和运用&#xff0c;但是英语作为外国语和语文又不太一样&#xff0c;相对来说考的更简单一些。不过要拿高分也不容易。 为了帮助高三的学子们提升英语备考的效率&#xff0c;争取多提分&#xff0c;六分职场特撰写这篇…

信息系统项目管理师教程 第四版【第5章-信息系统工程-思维导图】

信息系统项目管理师教程 第四版【第5章-信息系统工程-思维导图】 课本里章节里所有蓝色字体的思维导图

ZYNQ连载05-Vitis更新xsa硬件配置

ZYNQ连载05-Vitis更新xsa硬件配置 1. 简述 在开发过程中&#xff0c;Vivado中硬件配置在开发过程中有所变动&#xff0c;Vitis需要根据Vivado生成的xsa文件&#xff0c;更新相应的BSP配置 2. 操作步骤

基于SSM的个性化美食推荐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【斗罗二】王东升级三环,戴华斌挑衅,雨浩单手接鼎订下赌约

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《绝世唐门》第20集&#xff0c;一场瞩目的战斗即将爆发。王冬&#xff0c;这位一年级的强攻系班长&#xff0c;将与戴华斌进行一场激烈的较量。王冬拥有三大武魂&#xff0c;其中最为人们所熟知的是那光明女神蝶&#x…

美食论坛大全订阅交流系统 uniapp+vue 微信小程序设计与实现

美食大全订阅小程序在系统的智能手机上可以运行&#xff0c;主要实现了首页、个人中心、用户管理、菜系管理、口味管理、美食分类管理、美食信息管理、美食论坛、系统管理等主要功能模块的操作和管理。 后端&#xff1a;java(springbootssm)/python/php/nodejs/ 开发运行&…

Mac 安装使用NPM及常用命令

环境&#xff1a; Mac 工具&#xff1a; NPM 可通过官网查询一些模块相关 NPM Doc 通过官网文档了解更多的关于NPM的使用 安装 NPM是Node.js的包管理工具&#xff0c;可用于解决 Node.js在代码部署上的问题。 新版本的Node.js已经集成了NPM&#xff0c; 因此可通过下载 Nod…

Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协议建立可靠连接的过程&#xff0c;确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程&#xff1a; 假设客户端为A&#xff0c;服务器为B 1、第一次握手&#xff08;SYN1&#xff0c;seq500&…

【存储】lotusdb的原理及实现

最近看了lotusdb的源码。lotusdb是一个golang实现的嵌入式的持久化kv存储。 从整体设计上看&#xff0c;lotusdb采用了类似LSM树的架构&#xff0c;并采用了针对SSD的优化&#xff0c;将key和value分开存储。在此基础上&#xff0c;lotusdb将LSM树中存储key的SST使用B树或者ha…