交错字符串

题目链接

交错字符串

题目描述


注意点

  • s1、s2、和 s3 都由小写英文字母组成
  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • 能否仅使用 O(s2.length) 额外的内存空间来解决它

解答思路

  • 最初想到的是使用深度优先遍历,使用指针指向当前s3需要的字符、当前能取s1和s2的相应字符,如果都不是s3需要的字符,则说明当前情况不满足题意,否则需要取s1或s2中满足的字符并移动指针继续进行深度优先遍历。但是该方法时间复杂度不满足
  • 参考题解使用动态规划解决本题,思路为:使用二维数组dp存储是否是交错字符串,dp[i][j]表示s1中取前i个字符(即0~i - 1),s2中取前j个字符(即0~j - 1)能否交错组成s3中前i + j个字符,dp[s1.length()][s2.length()]代表的就是整个s1和整个s2能否交错组成s3,也就是本题的答案
  • dp[i][j]怎么由前面的dp推算出来?首先dp[0][0]一定满足题意(空字符串可以组成空字符串),dp[i][j]是否满足取决于以下两种情况:
    • 如果i大于0,其可以由dp[i - 1][j]是否满足、s1的第i个字符与s3的第i + j个字符是否相同决定
    • 如果j大于0,其可以由dp[i][j - 1]是否满足、s2的第j个字符与s3的第i + j个字符是否相同决定

代码

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n1 = s1.length();int n2 = s2.length();int n3 = s3.length();if (n1 + n2 != n3) {return false;}// dp[i][j]代表s1的前i个元素与s2的前j个元素能否组成s3的前i + j个字符boolean[][] dp = new boolean[n1 + 1][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 - 1][j]) {dp[i][j] = dp[i][j] || s1.charAt(i - 1) == s3.charAt(i + j - 1);}if (j > 0 && dp[i][j - 1]) {dp[i][j] = dp[i][j] || s2.charAt(j - 1) == s3.charAt(i + j - 1);}}}return dp[n1][n2];}
}

关键点

  • 动态规划的思想
  • 注意边界问题
  • 当dp[i][j]既能由i - 1又能由j - 1决定时,只要其中一个满足交错字符串dp[i][j]就满足

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

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

相关文章

【协议篇:Http与Https】

1. Http 1.1 Http的定义 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上最广泛应用的数据通信协议之一&#xff0c;尤其对于万维网&#xff08;WWW&#xff09;服务而言…

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象&#xff1a;表test_0102&#xff0c;others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…

藏不住了!这20个技术点是运维老手的秘密武器

你们好&#xff0c;我的网工朋友。 信息技术系统的正常运行直接关系到企业或生产的正常运行。 然而&#xff0c;网工经常面临以下问题&#xff1a;网络速度慢、设备故障和应用系统效率低。 任何信息技术系统的故障&#xff0c;如果不及时处理&#xff0c;都会产生很大的影响…

【项目实战】【Docker】【Git】【Linux】部署V2rayA项目

今天着手了一个全新领域的项目&#xff0c;从完全没有头绪到成功运行&#xff0c;记录一下具体的部署流程 github项目链接V2rayA 一开始拿到以后完全没有抓手&#xff0c;去阅读了一下他的帮助文档 写着能用docker运行&#xff0c;就去下载了一个Docker配置了一下 拉取代码到…

frp内网穿透之(反向代理nginx)

通过公网 https 连接访问内网&#xff08;局域网&#xff09;本地http服务如下&#xff1a; 1.准备工作 ​ 想要实现内网穿透功能首先我们需要准备&#xff1a; 一台公网服务器&#xff08;用作frps的服务端&#xff09;一台需要做转发的内网服务器&#xff08;用作frpc的客…

求m和n的最大公约数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int remainder 1;int m 0;int n 0;int middle 0;//提示用户&#xff1b;printf("请输入整数m和n的值&#xff…

在不同操作系统中搭建Python编程环境

1 在不同操作系统中搭建Python编程环境 1.1 在Linux系统中搭建Python编程环境 1. 检查Python版本 在你的系统中运行应用程序Terminal&#xff08;如果你使用的是Ubuntu&#xff0c;可按Ctrl Alt T&#xff09;&#xff0c;打开一个终端窗口。为确定是否安装了Python&…

医保是如何报销的

《医保是如何报销的》 这是罗师兄的原创文章 预计5-6分钟读完 作者&#xff1a;罗师兄 地球号&#xff1a;luoyun515 很多时候大家听到医保报销比例80%&#xff0c;85%&#xff0c;90%等&#xff0c; 但真正报销后&#xff0c; 实际花费跟报销额度根本达不到这么高&#…

宏的使用(C语言详解)

在写一个代码生成可执行文件的过程需要经过编译和链接&#xff0c;编译又要经过三部&#xff1a;预处理&#xff0c;编译&#xff0c;汇编。 #define定义的变量和宏就是在预处理阶段会处理的。 一个简单的宏定义&#xff1a; #include<stdio.h>; #define Max(a,b) a>…

《Java面试自救指南》(专题三)数据库

文章目录 一条sql语句的查询流程有哪些数据库存储引擎&#xff0c;各自的区别数据库的三大范式事务的四大特性&#xff08;含隔离级别&#xff09;MySQL四种隔离机制的底层实现&#xff08;如何解决幻读 &#xff09;MySQL有哪几种锁&#xff0c;分别怎么实现数据库中有哪些索引…

ROS服务通信

ROS有两种通信方式&#xff1a;话题通信、服务通信。 话题通信是基于发布订阅模式的&#xff0c;即&#xff1a;一个节点发布消息&#xff0c;另一个节点订阅该消息。发布方和订阅方不相互影响&#xff0c;也就是发布方只负责发消息&#xff0c;订阅方只负责订阅消息。 服务通…

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…