华为机试牛客刷题之HJ75 公共子串计算

news/2025/2/27 11:02:26

HJ75 公共子串计算

描述

对于给定的两个字符串s和t,你需要找出它们的最长公共子串的长度。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。

如果字符串 α 的一个子串 a’与字符串b的一个子串b 完全相等,那么子串 α’,b’是字符串a,b的一个公共子串。

输入描述:

第一行输入一个长度为 1 <= len(s)<= 150、仅由小写字母组成的字符串 s。
第二行输入一个长度为 1 <= len(t)<= 150、仅由小写字母组成的字符串 t。

输出描述:

输出一个整数,代表s和t的最长公共子串的长度。

示例1

输入:
awaabb
aawbb
输出:
2
说明:在这个样例中,"aa" 和 "bb" 都是 s 和 t 的最长公共子串。

示例2

输入:
asdfas
werasdfaswer
输出:
6

以下是把代码喂给deepseek后对 最长公共子串 代码的通俗易懂解释,结合生活中的比喻帮助理解:


1. 问题场景

假设你有两个字符串:

  • 字符串1:"abcdefg"
  • 字符串2:"zbcdf"

你想找到它们最长的 连续相同部分(子串)。比如它们的共同子串是 "bcd",长度为 3


2. 动态规划思想

我们用一个 表格(二维数组 dp)来记录每一步的“最长连续相同部分长度”。

表格定义
  • dp[i][j] 表示:以字符串1的第 i 个字符 和 字符串2的第 j 个字符 结尾 的最长公共子串长度。

例如:

  • dp[3][2] 表示以字符串1的第3个字符(比如 c)和字符串2的第2个字符(比如 b)结尾的最长公共子串长度。

3. 填表规则

(1) 当前字符匹配

如果字符串1的第 i 个字符和字符串2的第 j 个字符相同:

  • 相当于连续相同部分多了一个字符,所以当前长度 = 左上角的值 + 1。
  • 公式dp[i][j] = dp[i-1][j-1] + 1
    (比如之前的连续相同部分是 "bc",现在多了 d,变成 "bcd"
(2) 当前字符不匹配

如果字符不同:

  • 连续相同部分中断,当前长度重置为 0。
  • 公式dp[i][j] = 0

4. 代码逐行解释

java">import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { // 处理多组输入
            String text1 = in.nextLine(); // 输入字符串1
            String text2 = in.nextLine(); // 输入字符串2
            int m = text1.length(); // 字符串1的长度
            int n = text2.length(); // 字符串2的长度
            int[][] dp = new int[m + 1][n + 1]; // 创建动态规划表格
            int result = 0; // 记录最长公共子串的长度

            // 遍历字符串1的每个字符
            for (int i = 1; i <= m; i++) {
                char temp1 = text1.charAt(i - 1); // 当前字符
                // 遍历字符串2的每个字符
                for (int j = 1; j <= n; j++) {
                    char temp2 = text2.charAt(j - 1); // 当前字符
                    if (temp1 == temp2) { // 如果字符匹配
                        dp[i][j] = dp[i - 1][j - 1] + 1; // 长度 = 左上角值 + 1
                        result = Math.max(result, dp[i][j]); // 更新最大值
                    } else { // 如果字符不匹配
                        dp[i][j] = 0; // 重置为0
                    }
                }
            }
            System.out.println(result); // 输出最长公共子串的长度
        }
    }
}

5. 实际例子

假设 text1 = "abcdefg"text2 = "zbcdf",它们的 最长公共子串"bcd",长度为 3。填表过程如下:

abcdefg
000000000
z00000000
b00100000
c00020000
d00003000
f00000010
  • 关键步骤
    • i=2(字符 b)和 j=2(字符 b)时,匹配成功,长度更新为 dp[1][1] + 1 = 0 + 1 = 1
    • i=3(字符 c)和 j=3(字符 c)时,匹配成功,长度更新为 dp[2][2] + 1 = 1 + 1 = 2
    • i=4(字符 d)和 j=4(字符 d)时,匹配成功,长度更新为 dp[3][3] + 1 = 2 + 1 = 3

6. 总结

  • 核心思想:通过表格记录以每个字符结尾的最长公共子串长度,逐步推导全局最大值。
  • 时间复杂度:O(mn),其中 m、n 是字符串长度。
  • 适用场景:文本匹配、基因序列分析等需要找连续相同部分的场景。


http://www.niftyadmin.cn/n/5870007.html

相关文章

QILSTE H6-C210FO/5M高亮橙光LED灯珠 发光二极管LED

### H6-C210FO/5M&#xff1a;高亮橙光LED的技术参数与复杂特性 在电子设备的精密制造领域&#xff0c;H6-C210FO/5M型号的高亮橙光LED凭借其独特的设计和复杂的参数规格脱颖而出。这款由QILSTE&#xff08;Hong Kong&#xff09;Technology Co., Ltd生产的LED&#xff0c;尺寸…

004 Kafka异常处理

6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列&#xff08;DLQ&#xff09;配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载 在游戏和视频播放时&#xff0c;你是否遇到过分辨率不匹配、画质模糊的问题&#xff1f;今天给大家介绍一款神器——Lossless Scaling&#xff08;拼好帧&#xff09;&#xff0c;也被玩家们亲切地称为“小黄鸭”&#xff0…

磁场定向控制 (FOC)模型的C语言实现(STM32G4)

目录 概述 1 磁场定向控制 (FOC)介绍 1.1 FOC控制模型介绍 1.2 模型功能 2 FOC模型的几个重要的转换关系 2.1 Clarke Transform 2.2 Inverse Clarke Transform 2.3 Park Transform 2.4 Inverse Park Transform 3 STM32模拟实现FOC 3.1 FOC算法的C语言实现 3.2…

网络安全词汇

什么是注入&#xff1f; (转自360安全论坛)   随着B/S模式应用开发的发展&#xff0c;使用该模式编写程序的程序员越来越来越多&#xff0c;但是由于程序员的水平参差不齐&#xff0c;相当大一部分应用程序存在安全隐患。用户可以提交一段数据库查询代码&#xff0c…

SpringBoot——生成Excel文件

在Springboot以及其他的一些项目中&#xff0c;或许我们可能需要将数据查询出来进行生成Excel文件进行数据的展示&#xff0c;或者用于进行邮箱发送进行附件添加 依赖引入 此处demo使用maven依赖进行使用 <dependency><groupId>org.apache.poi</groupId>&…

在线会议时, 笔记本电脑的麦克风收音效果差是为什么

背景 最近在线面试. 使用腾讯会议或者飞书, 戴耳机参加在线面试, 遇到好几个面试官说我的音质不好. 一直没在意, 后来反思, 应该是电脑哪里出了问题. 排查 先买了一副品牌有线耳机, 测试后本地录制的声音仍然品质很差去掉耳机延长线后, 麦克风品质仍然很差最终找到答案, 原…

高可用、高性能、负载均衡集群的区别

维度高可用集群高性能集群负载均衡集群核心目标服务持续可用&#xff0c;减少停机加速计算任务&#xff0c;提升处理能力请求分发算法、健康检查关键技术冗余、心跳检测、鼓掌转移并行计算、高速网络、分布式存储请求分发算法、健康检查典型应用数据库主从切换、关键业务系统科…