当前位置: 首页 > news >正文

97. 交错字符串

题目链接:力扣(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()];}
}

相关文章:

  • ES Nested解释
  • eslint识别不了别名解决方法
  • H5游戏源码分享-考眼力游戏猜猜金币在哪
  • 大模型在百度智能问答、搜索中的应用
  • selenium工作原理和反爬分析
  • ZKP7.1 Polynomial Commitments Based on Error-correcting Codes (Background)
  • 【前端性能】性能优化手段-高频面试题
  • JavaScript怎么把整数转换为字符串
  • 软考下午第一题 案列分析
  • C# Winform编程(10)Chart图表控件
  • 信息系统项目管理师教程 第四版【第5章-信息系统工程-思维导图】
  • git 推送到github远程仓库细节处理(全网最良心)
  • (二开)Flink 修改源码拓展 SQL 语法
  • Day 13 python学习笔记
  • Leetcode.274 H 指数
  • JS 中的深拷贝与浅拷贝
  • 03Go 类型总结
  • 3.7、@ResponseBody 和 @RestController
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • exports和module.exports
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • javascript面向对象之创建对象
  • javascript数组去重/查找/插入/删除
  • Java编程基础24——递归练习
  • Linux各目录及每个目录的详细介绍
  • Lsb图片隐写
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 基于游标的分页接口实现
  • 老板让我十分钟上手nx-admin
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 一道闭包题引发的思考
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (3)(3.5) 遥测无线电区域条例
  • (第61天)多租户架构(CDB/PDB)
  • (二)c52学习之旅-简单了解单片机
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转) ns2/nam与nam实现相关的文件
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ****Linux下Mysql的安装和配置
  • ***利用Ms05002溢出找“肉鸡
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Project Open Day(2011.11.13)
  • .NET 指南:抽象化实现的基类
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET开源快速、强大、免费的电子表格组件