leetcode/字符串交织,s1和s2字符串交织组成s3
代码
package com.xcrj;/*** 剑指 Offer II 096. 字符串交织* 给定三个字符串 s1、s2、s3,请判断 s3 能不能由 s1 和 s2 交织(交错) 组成。* 两个字符串 s 和 t 交织 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:* - s = s1 + s2 + ... + sn* - t = t1 + t2 + ... + tm* - |n - m| <= 1* - 交织 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...*/
public class Solution96 {/*** 动态规划:将多阶段过程转换为单阶段问题,将单阶段问题的解存储在动态规划数组中* <p>* 多阶段化单阶段:f[s1的前i个元素][s2的前j个元素]=能否组成s3的前i+j个元素** <p>* 状态转移方程* - 定义f[i][j]表示s1的前i个元素和s2的前j个元素是否能交织组成s3的前i+j个元素,f[s1的前i个元素][s2的前j个元素]=能否组成s3的前i+j个元素* - 若s1[i-1]=s3[i+j-1],则f[i][j]取决于f[i-1][j],s1[0到i]和s2[0到j]能否交织组成s3[0到i+j] 取决于 s1[0到i-1]和s2[0到j]能否交织组成s3[0到i+j-1]* - 若s2[j-1]=s3[i+j-1],则f[i][j]取决于f[i][j-1],s1[0到i]和s2[0到j]能否交织组成s3[0到i+j] 取决于 s1[0到i]和s2[0到j-1]能否交织组成s3[0到i+j-1]*/public boolean isInterleave1(String s1, String s2, String s3) {// 长度不一致,s1和s3一定不能组成s3if (s1.length() + s2.length() != s3.length()) {return false;}// 定义f[i][j]表示s1[前i个元素]和s2[前j个元素]是否能交织组成s3[前i+j个元素]// f[s1的前i个元素][s2的前j个元素]=能否组成s3的前i+j个元素// +1,因为初始f[0][0]=trueboolean[][] f = new boolean[s1.length() + 1][s2.length() + 1];// 初始状态是没有元素的,认为s1[前0个元素]和s2[前0个元素]能够交织组成s3[前0个元素]f[0][0] = true;// =,f[s1的前i个元素][s2的前j个元素]=能否组成s3的前i+j个元素,前i个元素,前s1.len个元素就是取s1整个字符串for (int i = 0; i <= s1.length(); i++) {for (int j = 0; j <= s2.length(); j++) {// 处理s1的下一个元素// s1[i-1]可能与s3[i+j-1]相等,s1的第i个元素可能和s3的第i+j个元素相等if (i > 0) {// 若s1[i-1]=s3[i+j-1],则f[i][j]取决于f[i-1][j],s1[前i个元素]和s2[前j个元素]能否交织组成s3[前i+j个元素] 取决于 s1[前i-1个元素]和s2[前j个元素]能否交织组成s3[前i+j-1个元素]f[i][j] = f[i][j] || (s1.charAt(i - 1) == s3.charAt(i + j - 1) && f[i - 1][j]);}// 处理s2的下一个元素// s2[j-1]可能与s3[i+j-1]相等,s2的第j个元素可能和s3的第i+j个元素相等if (j > 0) {// 若s2[j-1]=s3[i+j-1],则f[i][j]取决于f[i][j-1],s1[前i个元素]和s2[前j个元素]能否交织组成s3[前i+j个元素] 取决于 s1[前i个元素]和s2[前j-1个元素]能否交织组成s3[前i+j-1个元素]f[i][j] = f[i][j] || (s2.charAt(j - 1) == s3.charAt(i + j - 1) && f[i][j - 1]);}}}return f[s1.length()][s2.length()];}/*** 动态规划+滚动数组** 滚动数组* - 数组f的第i行只和第i−1行相关,使用滚动方式代替行* - 滚动,第i行取决于第i-1行,等式右侧的f[j]是代表f[s1的前i-1个元素][s2的前j个元素],左侧f[j]代表f[s1的前i个元素][s2的前j个元素]*/public boolean isInterleave2(String s1, String s2, String s3) {// 长度不一致,s1和s3一定不能组成s3if (s1.length() + s2.length() != s3.length()) {return false;}// 数组f的第i行只和第i−1行相关,使用滚动方式代替行// 定义f[i][j]表示s1[前i个元素]和s2[前j个元素]是否能交织组成s3[前i+j个元素]// f[s1的前i个元素][s2的前j个元素]=能否组成s3的前i+j个元素// +1,因为初始f[0][0]=trueboolean[] f = new boolean[s2.length() + 1];// 初始状态是没有元素的f[0] = true;// =, f[j]记录s1[前i个元素]和s2[前j个元素]是否能交织组成s3[前i+j个元素],前s1.len个元素就是s1整个字符串for (int i = 0; i <= s1.length(); i++) {for (int j = 0; j <= s2.length(); j++) {// 处理s1的下一个元素// s1[i-1]可能与s3[i+j-1]相等,s1的第i个元素可能和s3的第i+j个元素相等if (i > 0) {// 若s1[i-1]=s3[i+j-1],则f[i][j]取决于f[i-1][j],s1[前i个元素]和s2[前j个元素]能否交织组成s3[前i+j个元素] 取决于 s1[前i-1个元素]和s2[前j个元素]能否交织组成s3[前i+j-1个元素]// 滚动,第i行取决于第i-1行,等式右侧的f[j]是代表f[s1的前i-1个元素][s2的前j个元素],左侧f[j]代表f[s1的前i个元素][s2的前j个元素]f[j] = s1.charAt(i - 1) == s3.charAt(i + j - 1) && f[j];}// 处理s2的下一个元素// s2[j-1]可能与s3[i+j-1]相等,s2的第j个元素可能和s3的第i+j个元素相等if (j > 0) {// 若s2[j-1]=s3[i+j-1],则f[i][j]取决于f[i][j-1],s1[前i个元素]和s2[前j个元素]能否交织组成s3[前i+j个元素] 取决于 s1[前i个元素]和s2[前j-1个元素]能否交织组成s3[前i+j-1个元素]f[j] = f[j] || (s2.charAt(j - 1) == s3.charAt(i + j - 1) && f[j - 1]);}}}return f[s2.length()];}
}
参考
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/IY6buf/solution/zi-fu-chuan-jiao-zhi-by-leetcode-solutio-i4ni/
来源:力扣(LeetCode)
leetcode/字符串交织,s1和s2字符串交织组成s3相关推荐
- java 字符串比较 == equals_java怎么比较字符串,==和equals有什么区别
String类型是Object类型,通过new操作符构建的字符串指向不同的对象. ==:是用来比较两个引用是否指向同一个对象,当引用指向同一个对象则为true,否则为false.s1和s2字符串的值虽 ...
- c语言中接收字符串函数,C语言中字符串处理函数拾锦
之前在学习C语言的时候,知道C语言库函数中有很多字符串处理函数,但是没怎么好好利用它.最近,发现它们的作用实在太大了,而且有些是我从来都没有用过的.今天想整理一下,方便以后使用.比较容易理解的,就没有 ...
- Leetcode Day10 最长公共子序列+字符串交织
1.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 是指这样一个新的字符串:它是由 ...
- 算法019:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
题目:字符串轮转.给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串).示例1:输入:s1 = "waterb ...
- 经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)
题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given tw ...
- c语言memcmp和java的_C语言memcmp()函数:比较m字节长的两个字符串s1和s2
函数名:memcmp 头文件: 函数原型: void* memcmp(void *s1,void *s2,unsigned m); 功能:比较m字节长的两个字符串s1和s2 参数: s1 和 s2 为 ...
- 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...
- c语言两个字符串比较,将两个字符串s1和s2比较,如果s1s2,作业 - 编一个程序,将两个字符串s1和s2比较,如果.doc...
作业 - 编一个程序,将两个字符串s1和s2比较,如果 作业(第一次) 求下面表达式的值: x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7 (float)(a+b)/2+( ...
- 写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2。要求当s1=s2
写一函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2.要求当s1=s2 ...
最新文章
- js变量传给java_如何把JavaScript中的变量值传给javabean?
- neo4j在linux下的安装
- lwip协议栈在linux运行,2.通过LWIP协议栈使用学习http,tcp,网卡之间的关系.
- 协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
- 操作系统(13)-操作系统中的死锁及其预防、避免、检测与解除
- 357.计算各个位数不同的数字个数
- 快速开发平台learun7.0.3发布,看看各版本有什么更新吧
- 重标极差分析 Hurst指数计算
- 昨天与友人聊的二三观点
- 【雅思大作文考官范文】——第十六篇:climate change essay
- rman命令之crosscheck
- java+vue实现词云生成+展示(kumo+echarts-wordcloud )
- 【离线】esrally实践总结
- 细数数据科学团队中的十大关键角色
- 云计算、公有云、私有云、混合云等
- 百岁老人畅谈百年交大桥梁[转]
- php钓鱼怎么使用方法,初学钓鱼最详细的方法教程
- 什么是STW以及CMS和G1优缺点?
- vue手机号中间四位加*号
- jQuery(入门选择器)
热门文章
- 响应式分布式区别_边缘计算的七种定义,边缘计算与云计算、雾计算的区别
- 利用CyclicBarrier实现赛马游戏
- 2022上海市安全员C证考试题库模拟考试平台操作
- 学计算机买笔记本是i5 i7,为什么懂电脑的人选择买i5处理器, 而不是i7, 背后是什么原因?...
- EditTextand TextView
- Java应用程序安全框架
- font-variant-numeric
- 简洁,简单,再简化...
- Android 经验: 本地 5555 端口会被 adb 误认为 emulator
- java 计算某个时间段在多个时间段中分别用时