java字符串匹配dp_Java数据结构与算法之交错字符串97(DP)
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
思路分析
当我看到这道题的第一想法是用三指针的方法解决:index1指向s1,index2指向s2,index3指向s3。按照顺序判断s3的字符是否与s1、s2的字符一致,即先与s1判断,不一致再与s2判断;若都不一样则输出false。
但这个解法在随后的测试中暴露了问题,与s1、s2比较是存在先后顺序的,所以如果s2出现s3的前部,则会出现问题。
比如"aa" "ab" "abaa"这个案例中,结果显示false,明显是错误的。
所以基于以上的问题,我们重新考虑问题。使用动态规划解题。我们依旧使用上面的案例进行解释。
首先考虑边界条件,s1.length()+s2.length() != s3.length()这种情况那么必然输入false;
s1.length()+s2.length() == s3.length()时,我们可以利用DP思想解决这个问题;
定义dp[i][j]为s1的前i个元素和s2的前j个元素是否可以组合成s3的前i+j个元素;
因此想要判断dp[i][j]位置的状态需要知道dp[i-1][j]或dp[i][j-1]的状态,换言之,只有dp[i-1][j]或dp[i][j-1]为true才会有dp[i][j]的进一步判断;
dp[i-1][j]代表s1的前i-1个元素和s2的前j个元素的组合状态。那么s1的第i-1元素呢,它是否可以组合为s3的第i+j-1元素呢?
所以dp[i-1][j]与s1.charAt(i-1) == s3.charAt(i+j-1)才是dp[i][j]的真实状态;反之dp[i][j-1]亦然;
DP的初始状态dp[0][0]必然为true。
所以我们可以推导出动态规划方程为:dp[i][j] = (dp[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1)) || (dp[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1))
代码实现
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
int index1 = s1.length(), index2 = s2.length();
if(s3.length() != index1+index2) {
return false;
}
boolean[][] dp = new boolean[index1+1][index2+1];
dp[0][0] = true;
// 为什么这儿要从0开始遍历呢?这就是三指针的问题所在。
// 当s3的开头字符是s2,这样在i=0的情况下就可以先搜索s2字符串了。
for(int i = 0; i <= index1; i++) {
for(int j = 0; j <= index2; j++) {
int p = i+j-1;
if(i > 0) {
// 这儿不加dp[i][j]的原因是先判断if(i > 0)
// 如果i<0,那么dp[i][j]就是默认值false,不影响下面的执行
dp[i][j] = dp[i-1][j] && s1.charAt(i-1) == s3.charAt(p);
}
if(j > 0) {
// 这儿为什么要加dp[i][j]?
// 如果在if(i > 0)中已经判断为true了,则不用再判断了
// 如果在if(i > 0)中已经判断为false了,则继续判断在if(j > 0)条件下是否满足
dp[i][j] = dp[i][j] || dp[i][j-1] && s2.charAt(j-1) == s3.charAt(p);
}
}
}
return dp[index1][index2];
}
}
执行结果
来源:https://www.cnblogs.com/njuptzheng/p/13338257.html
java字符串匹配dp_Java数据结构与算法之交错字符串97(DP)相关推荐
- C语言(CED)多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好。
最近遇到一道题目:多组字符串匹配,输出所有重复出现的字符串,多次重复出现的只输出一次就好. 举个例子: input:qwer qwer sdfgh output:qwer 题意大致就是这样,下面给出我 ...
- 数据结构与算法 / 字符串匹配 / BF、PK 算法
零.前言 为了下面便于说明,先定义两个名词,分别是主串和模式串.在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串. 假设,主串中字符数量为 L1,模式串的字符数量为 L2 . 一.BF 算 ...
- 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...
前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...
- java 字符串匹配_多模字符串匹配算法原理及Java实现代码
多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于 ...
- 字符串匹配的三种算法
1.一道字符串匹配题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0 ...
- 【算法无用系列】字符串匹配那些事——BM算法
文章目录 前言 一.BM算法 1.1.坏字符规则 1.2.好后缀规则 前言 BF算法和RK算法思路比较简单,但是效率却不尽人意,适合较短的字符串匹配时使用,如果需要在较长的字符串匹配时,则需在算法上进 ...
- java环形链表_数据结构和算法(四)Java实现环形链表
1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...
- 模糊字符串匹配:双音素算法
介绍 名称匹配的主要问题之一是出错的可能性. 人们拼写同一个名字(错别字)的方式有很多,他们都听别人说的话. 有多种方法可以破坏自由格式语言数据. 当您需要搜索/匹配不良数据时,这会引起很多麻烦. 有 ...
- 模糊字符串匹配:双重解密算法
名称匹配的一个大问题是错误的倾向.有许多不同的方式,人们拼写相同的名字,打字错误,误读了另一个人说的话.有许多方法可以免费形式的语言数据被破坏.当您需要搜索/匹配不良数据时,会导致许多头疼. 有很多不 ...
最新文章
- 【鉴轻尘】你说你炒的了币,开发得了项目,然而这些你都知道吗?
- su - oracle和su oracle有什么区别
- js中怎么为同级元素添加点击事件
- json 和 jsonp
- golang beego快速入门示例(单文件hello.go)
- wxWidgets:wxTextCompleterSimple类用法
- 【Servlet】HTTP 协议之请求方式、Servlet介绍、Servlet 的生命周期
- Spring Boot-使用JDBC连接并检索数据库(Mysql在Docker中)
- ros melodic 版本sudo rosdep init和rosdep upgrade失败的解决办法
- CVPR2021 P2GAN:提高图像风格迁移的鲁棒性
- Socket简单介绍(通过NSStream)
- 安卓系统dicom阅读器_文石BOOX发布新品poke2 color 全球首款开放系统彩色电纸书
- 浅谈Spark中的宽依赖和窄依赖
- 3D游戏建模快速制作枪械的几种方法【3Dmax,Zbrush,Maya】
- 恩淑 2004-12-18
- hadoop 3.3.1 安装笔记
- 1-1-5、行为型设计模式
- spring定时任务cron为每季度第一个工作日转换为cron表达式
- 无人机在抢险救灾的优化运用---2017年中国研究生数学建模竞赛A题 (试题+优秀论文)
- C语言handle对象对应java,c语言和java语言之间的关系到底是怎么样的,两种 体系?还是一种体系的不同阶段?还是其它的什么?...
热门文章
- 使用正则替换img标签的src属性
- 基于Java毕业设计学生综合测评系统源码+系统+mysql+lw文档+部署软件
- 内存屏障 linux,Linux中内存屏障
- C#上传图片至数据库
- Killed signal terminated program cc1plus
- 封装 电流密度 重布线_一种提高TSV热机械可靠性的复合结构及其制造方法与流程...
- 批处理操作注册表教程
- 温馨浪漫HTML表白爱情源码大气简洁单页源码(html生日快乐网站制作)
- 西门子 SMART 三轴程序, 西门子控制器SMART---ST60, 西门子触摸屏SMART,IE,V3,绝对位置运动控制全套程序
- JavaWEB九:thymeleaf 之 分页显示和关键字查询