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

Leetcode JAVA刷刷站(97)交错字符串

一、题目概述

二、思路方向 

        为了验证字符串 s3 是否由 s1 和 s2 交错组成,我们可以使用动态规划(Dynamic Programming, DP)的方法来解决这个问题。

       首先,我们需要定义状态 dp[i][j],它表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i+j 个字符。

        接下来,我们考虑状态转移方程:

  • 如果 s1[i-1] == s3[i+j-1](即 s1 的第 i 个字符与 s3 的第 i+j 个字符相等),那么 dp[i][j] 可以从 dp[i-1][j] 转移而来,即 s1 的前 i-1 个字符和 s2 的前 j 个字符交错组成 s3 的前 i+j-1 个字符后,再加上 s1 的第 i 个字符。
  • 同理,如果 s2[j-1] == s3[i+j-1](即 s2 的第 j 个字符与 s3 的第 i+j 个字符相等),那么 dp[i][j] 可以从 dp[i][j-1] 转移而来。

初始条件为:

  • dp[0][0] = true,因为两个空字符串可以交错组成空字符串。
  • 对于 dp[0][j]j > 0),只有当 s2 的前 j 个字符与 s3 的前 j 个字符完全相等时,dp[0][j] 才为 true
  • 同理,对于 dp[i][0]i > 0),只有当 s1 的前 i 个字符与 s3 的前 i 个字符完全相等时,dp[i][0] 才为 true

       最后,我们只需要检查 dp[len(s1)][len(s2)] 是否为 true,其中len(s1) 和 len(s2) 分别是 s1 和 s2 的长度。

三、代码实现 

public class Solution {  public boolean isInterleave(String s1, String s2, String s3) {  int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();  if (len1 + len2 != len3) {  return false; // 长度不匹配,直接返回false  }  boolean[][] dp = new boolean[len1 + 1][len2 + 1];  dp[0][0] = true; // 初始化  // 初始化第一行  for (int j = 1; j <= len2; j++) {  dp[0][j] = dp[0][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);  }  // 初始化第一列  for (int i = 1; i <= len1; i++) {  dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);  }  // 填充DP表  for (int i = 1; i <= len1; i++) {  for (int j = 1; j <= len2; j++) {  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));  }  }  return dp[len1][len2];  }  public static void main(String[] args) {  Solution solution = new Solution();  String s1 = "aab";  String s2 = "axb";  String s3 = "aabxb";  System.out.println(solution.isInterleave(s1, s2, s3)); // 输出 true  }  
}

执行结果: 

四、小结

        这段代码定义了一个 isInterleave 方法来判断 s3 是否可以由 s1 和 s2 交错组成,并在 main 方法中给出了两个示例来验证其正确性。

 结语  

愿你在人生的每一个阶段

都能遇见最好的自己

收获满满的幸福与成就

!!!


http://www.mrgr.cn/news/10968.html

相关文章:

  • RabbitMQ的高可用
  • React 实现请求接口封装
  • 深入探讨Java多线程
  • 分类预测|基于Transformer-LSTM的数据分类预测Matlab程序 多特征输入多类别输出
  • 【日常记录-JS】多个react打包的dist目录如何同时放到一个nginx上生效
  • 猫头虎 分享:如何用STAR(情境、任务、行动、结果)方法来结构化回答问题?
  • nmcli网卡管理
  • 前端工作常用知识
  • 【数据结构2】链表(使用头插法和尾插法创建链表)、链表的插入和删除、双链表节点的插入、双链表节点的删除
  • 基于x86 平台opencv的图像采集和seetaface6的静默活体功能
  • vue2前端阿里云oss断点续传
  • Java与C#在中国:我们在信息技术领域的脆弱性和依赖性
  • Vue axios在Spring Boot 的 Controller中接收数组类型的参数
  • 视觉SLAM十四讲-理论到实践课程作业笔记-第六讲-光流法和直接法
  • 数据仓库系列8:如何设计一个高性能的数据仓库模型?
  • 滴滴出行:分布式数据库的架构演进之路|OceanBase案例
  • 【Linux】第十七章 多路转接(select+poll+epoll)
  • Java 使用ListUtils对List分页处理
  • 什么时候用render_template,什么时候用Ajax?
  • 深度学习-11-为什么AI需要GPU