代码

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相关推荐

  1. java 字符串比较 == equals_java怎么比较字符串,==和equals有什么区别

    String类型是Object类型,通过new操作符构建的字符串指向不同的对象. ==:是用来比较两个引用是否指向同一个对象,当引用指向同一个对象则为true,否则为false.s1和s2字符串的值虽 ...

  2. c语言中接收字符串函数,C语言中字符串处理函数拾锦

    之前在学习C语言的时候,知道C语言库函数中有很多字符串处理函数,但是没怎么好好利用它.最近,发现它们的作用实在太大了,而且有些是我从来都没有用过的.今天想整理一下,方便以后使用.比较容易理解的,就没有 ...

  3. Leetcode Day10 最长公共子序列+字符串交织

    1.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 是指这样一个新的字符串:它是由 ...

  4. 算法019:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

    题目:字符串轮转.给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串).示例1:输入:s1 = "waterb ...

  5. 经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

    题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given tw ...

  6. c语言memcmp和java的_C语言memcmp()函数:比较m字节长的两个字符串s1和s2

    函数名:memcmp 头文件: 函数原型: void* memcmp(void *s1,void *s2,unsigned m); 功能:比较m字节长的两个字符串s1和s2 参数: s1 和 s2 为 ...

  7. 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串

    求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...

  8. 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+( ...

  9. 写一函数,实现两个字符串的比较。即自己写一个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 ...

最新文章

  1. js变量传给java_如何把JavaScript中的变量值传给javabean?
  2. neo4j在linux下的安装
  3. lwip协议栈在linux运行,2.通过LWIP协议栈使用学习http,tcp,网卡之间的关系.
  4. 协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
  5. 操作系统(13)-操作系统中的死锁及其预防、避免、检测与解除
  6. 357.计算各个位数不同的数字个数
  7. 快速开发平台learun7.0.3发布,看看各版本有什么更新吧
  8. 重标极差分析 Hurst指数计算
  9. 昨天与友人聊的二三观点
  10. 【雅思大作文考官范文】——第十六篇:climate change essay
  11. rman命令之crosscheck
  12. java+vue实现词云生成+展示(kumo+echarts-wordcloud )
  13. 【离线】esrally实践总结
  14. 细数数据科学团队中的十大关键角色
  15. 云计算、公有云、私有云、混合云等
  16. 百岁老人畅谈百年交大桥梁[转]
  17. php钓鱼怎么使用方法,初学钓鱼最详细的方法教程
  18. 什么是STW以及CMS和G1优缺点?
  19. vue手机号中间四位加*号
  20. jQuery(入门选择器)

热门文章

  1. 响应式分布式区别_边缘计算的七种定义,边缘计算与云计算、雾计算的区别
  2. 利用CyclicBarrier实现赛马游戏
  3. 2022上海市安全员C证考试题库模拟考试平台操作
  4. 学计算机买笔记本是i5 i7,为什么懂电脑的人选择买i5处理器, 而不是i7, 背后是什么原因?...
  5. EditTextand TextView
  6. Java应用程序安全框架
  7. font-variant-numeric
  8. 简洁,简单,再简化...
  9. Android 经验: 本地 5555 端口会被 adb 误认为 emulator
  10. java 计算某个时间段在多个时间段中分别用时