LeetCode 97: 交错字符串

 

这里我们考虑用 s1和 s2的某个前缀是否能形成 s3 的一个前缀。

这个方法的前提建立于:判断一个 s3的前缀(用下标 k表示),能否用 s1和 s2 的前缀(下标分别为 i和 j),仅仅依赖于 s1 前 i个字符和 s2 前 j个字符,而与后面的字符无关。

为了实现这个算法, 我们将使用一个 2D 的布尔数组 dp 。dp[i][j]表示用 s1的前 i和 s2的前 j个字符,总共 i+j个字符,是否交错构成 s3的前缀。为了求出 dp[i][j] ,我们需要考虑 两 种情况:

s1的第 i 个字符和 s2 的第 j 个字符都不能匹配 s3的第 k 个字符,其中 k=i + j 。这种情况下,s1和 s2的前缀无法交错形成 s3长度为 k 的前缀。因此,我们让 dp[i][j]为 False。

s1的第 i 个字符或者 s2的第 j 个字符可以匹配 s3的第 k个字符,其中 k=i+j 。假设匹配的字符是 x 且与 s1的第 i 个字符匹配,我们就需要把 x放在已经形成的交错字符串的最后一个位置。此时,为了我们必须确保 s1的前 (i-1)个字符和 s2的前 j 个字符能形成 s3的一个前缀。类似的,如果我们将 s2的第 j个字符与 s3的第 k 个字符匹配,我们需要确保 s1的前 i 个字符和 s2的前 (j-1) 个字符能形成 s3的一个前缀,我们就让 dp[i][j]为True 。

 

public class Solution {public bool IsInterleave(string s1, string s2, string s3){if((s1.Length  + s2.Length) != s3.Length)return false;bool[,] dp = new bool[s1.Length + 1, s2.Length + 1];for(int i = 0; i <= s1.Length; i++){for(int j = 0; j <= s2.Length; j++){if(i == 0 && j == 0)dp[i, j] = true;else if(i == 0)dp[i, j] = dp[i, j - 1] && s2[j - 1] == s3[i+ j - 1];else if(j == 0)dp[i, j] = dp[i - 1, j] && s1[i - 1] == s3[i+ j - 1];elsedp[i, j] = (dp[i - 1, j] && s1[i - 1] == s3[i+ j - 1]) || dp[i, j - 1] && s2[j - 1] == s3[i+ j - 1];}}return dp[s1.Length, s2.Length];}
}

复杂度分析

时间复杂度:O(m \cdot n)O(m⋅n) 。计算 dpdp 数组需要 m*nm∗n 的时间。

空间复杂度:O(m \cdot n)O(m⋅n)。2 维的 dpdp 数组需要 (m+1)*(n+1)(m+1)∗(n+1) 的空间。 mm 和 nn 分别是 s1s1 和 s2s2 字符串的长度。

优化:使用一维动态规划

这种方法与前一种方法基本一致,除了我们仅使用一维 dp数组去储存前缀结果。我们利用 dp[i-1]的结果和 dp[i]之前的结果来计算 dp[i],即滚动数组。

public bool IsInterleave(string s1, string s2, string s3){if((s1.Length  + s2.Length) != s3.Length)return false;bool[] dp = new bool[s2.Length + 1];for(int i = 0; i <= s1.Length; i++){for(int j = 0; j <= s2.Length; j++){if(i==0 && j == 0)dp[j] = true;else if(i == 0)dp[j] = dp[j - 1] && s2[j - 1] == s3[i+ j - 1];else if(j == 0)dp[j] = dp[j] && s1[i - 1] == s3[i+ j - 1];elsedp[j] = (dp[j] && s1[i - 1] == s3[i+ j - 1]) || dp[j - 1] && s2[j - 1] == s3[i+ j - 1];}}return dp[s2.Length];}

 

复杂度分析

时间复杂度:O(m⋅n);长度为 n 的 dp数组需要被填充 m 次。

空间复杂度:O(n);n是字符串 s1的长度

 

 

 

 

 

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

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

相关文章

苹果6发布时间_苹果秋季发布会将在北京时间9月16日举办

点击上方蓝字&#xff0c;关注我们苹果正式公布了苹果秋季发布会9月16日举办&#xff0c;届时国内可在五大平台上观看直播&#xff0c;据悉本次发布会将发布的产品有iPhone、ipad和Apple Watch等系列新品&#xff0c;那么这场发布会可以在哪看呢?下面小编带来了2020年苹果秋季…

安装ccs5.5总出现错误_《西游记》“斗法降三怪”,出现错误而补拍,观众总觉得改过结尾...

文|平小山86版《西游记》播出多年&#xff0c;每一年寒暑假都会在电视台重播&#xff0c;看了无数遍还是让观众乐在其中。后来无论是TVB版、浙版、还是张纪中版翻拍的《西游记》&#xff0c;都始终无法撼动它的经典地位。在86版《西游记》中有一集&#xff0c;就是在车迟国的“…

LeetCode面试题03. 数组中重复的数字

方法一&#xff1a;遍历数组 由于只需要找出数组中任意一个重复的数字&#xff0c;因此遍历数组&#xff0c;遇到重复的数字即返回。为了判断一个数字是否重复遇到&#xff0c;使用集合存储已经遇到的数字&#xff0c;如果遇到的一个数字已经在集合中&#xff0c;则当前的数字是…

涨跌因子计算器下载哪里下载_微信爱情指数计算器整蛊app下载_爱情指数计算器整蛊测试下载...

微信爱情指数计算器整蛊app是一款不错的爱情必备的计算器服务&#xff0c;让情侣们有一个很有意思的整蛊服务的App&#xff0c;喜欢的话快来下载吧。微信爱情指数计算器整蛊app介绍1、爱情指数计算器整蛊app是很有意思的一款爱情指数计算器软件2、操作起来也比较的简单&#xf…

如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?

第一章&#xff1a;小明和他的手机 从前有个人叫小明 小明有三大爱好&#xff0c;抽烟&#xff0c;喝酒…… 咳咳&#xff0c;不好意思&#xff0c;走错片场了。应该是逛知乎、玩王者农药和抢微信红包 小明的三大爱好 我们用一段简单的伪代码&#xff0c;来制造一个这样的小…

closewait一直不释放_夏至太阳庆典 || 巨蟹座日蚀新月大释放蜡烛魔法仪式(寻找新的幸运儿)...

太阳庆典. 2020夏至 太阳庆典蜡烛魔法仪式夏至(MIDSUMMER)是四个至点之一&#xff0c;站在春分与秋分之间&#xff0c;并且成为光明力量的象征&#xff0c;因为在这一天白昼的时间是最长的&#xff0c;也代表阳性力量会在这一天达到顶端。许多古老文化会利用火元素来象征这一…

Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约

6月3日钟落潭镇竹二村土地经营权流转签约仪式在白云产权中心顺利举行这是白云区首宗由政府主导的规模化土地流转↓↓↓<< 点击上方&#xff0c;观看完整视频 >>签约现场当天下午&#xff0c;竹二村经济联合社、广州市云供农业科技有限公司和广东三青农业科技有限公…

昆仑通态复制的程序可以用吗_一个PLC连接两个触摸屏例子,昆仑通态和普洛菲斯举例...

以昆仑通态触摸屏和普洛菲斯触摸屏说事啊。昆仑通态TCP7062普洛菲斯GP4402W在自动化设备中&#xff0c;如果设备跨度比较大的话&#xff0c;只有一个屏幕会让使用者不易看数据&#xff0c;要跑来跑去或者操作看不到动作点诸多问题&#xff0c;我做的项目中就有一个电柜只有一个…

Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案

1.ZTest & ZWrite ZTest&#xff1a;深度测试&#xff0c;开启后测试结果决定片元是否被舍弃&#xff0c;可配置 ZWrite&#xff1a;深度写入&#xff0c;开启后决定片元的深度值是否写入深度缓冲&#xff0c;可配置 ZTest可设置的测试规则&#xff1a; ZTest Less&…

LeetCode 235. 二叉搜索树的最近公共祖先

题解 官方的题解就很清晰 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/solution/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian--2/ 方法一&#xff1a;递归 public class Solution {public TreeNode LowestCommonAncestor(TreeN…

判断鼠标是否在元素上_能不能从大便上判断出一个人是否患有结肠癌?

通过大便的观察是可以怀疑是否得了结肠癌的&#xff0c;但并不是由于从大便上诊断患者得了癌症这个病。结肠癌症诊断金标准结肠癌的诊断的金标准做肠镜&#xff0c;通过肠镜进行观察&#xff0c;看是否有癌症。如果不明显&#xff0c;通过肉眼无法判断&#xff0c;一般要通过病…

LeetCode 240. 搜索二维矩阵

因为矩阵的行和列是排序的&#xff08;分别从左到右和从上到下&#xff09;&#xff0c;所以在查看任何特定值时&#xff0c;我们可以修剪O(m)O(m)或O(n)O(n)元素。 算法&#xff1a; 首先&#xff0c;我们初始化一个指向矩阵左下角的 (row&#xff0c;col)(row&#xff0c;co…

win10兼容模式怎么设置_win10护眼模式关不掉怎么办

win10系统是一款非常值得使用的优秀系统!强大的智能是win10系统最让人喜欢的地方&#xff0c;各种各样贴心的设置可以让用户们在使用电脑的过程中得到最好舒适体验&#xff0c;但是一些小伙伴们并不知道怎么才能设置好想要的设置&#xff0c;今天小编为大家带来的就是win10关闭…

Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5

一. Disable unused scripts and objects 场景中激活的物体或者脚本越多&#xff0c;开销越大。对于很多并没有产生作用的脚本和物体&#xff0c;可以隐藏掉从而提升性能&#xff0c;比如FPS游戏中视野外的部分。 1.Disabling objects by visibility 有时我们希望脚本和物体…

代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍

作者&#xff1a;Ti-Cool上周我们推送了《让数据库运行在浏览器里&#xff1f;TiDB WebAssembly 告诉你答案》&#xff0c;向大家展示了 TiDB-Wasm 的魅力&#xff1a;TiDB-Wasm 项目是 TiDB Hackathon 2019 中诞生的二等奖项目&#xff0c;实现了将 TiDB 编译成 Wasm 运行在浏…

C# int[,] 和 int[][]

原文链接&#xff1a;https://www.cnblogs.com/ILoveMyJob/p/9211102.html

java停车收费系统 源码开源_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统

每个Java程序员&#xff0c;从懵逼菜鸡&#xff0c;再到懵懂菜鸟&#xff0c;再到小鸟&#xff0c;大鸟&#xff0c;最后到技术大神&#xff0c;始终绕不开商城系统&#xff0c;里面蕴含了大量的业务&#xff0c;涉及到了大量的知识点和解决方案。今天介绍一款Java开源商城源码…

安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者

哈喽&#xff0c;大家好&#xff0c;好久没有玩PSP模拟器了&#xff0c;昨晚下载了一款PSP游戏的3A大作&#xff0c;这款游戏名字叫做《合金装备 和平步行者》&#xff0c;这款游戏发售时间是&#xff1a;2010年4月29日。本作是真真正正由小岛秀夫亲自主刀开发的系统正统作品&a…

UnityEngine.UI.dll 路径

2019.2之后&#xff0c;路径已经从 Unity安装目录下的Editor\Data\UnityExtensions移动到了 package里&#xff0c;通过package编译后生成的dll在工程目录下的library里