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

devtools/2025/3/3 3:13:37/

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(); // 输入字符串1String text2 = in.nextLine(); // 输入字符串2int 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; // 长度 = 左上角值 + 1result = 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.ppmy.cn/devtools/164077.html

相关文章

使用python做http代理请求

有这样一个需求现在有两台A&#xff0c;B两台电脑组成了一个局域网&#xff0c;在A电脑上开发webjava应用&#xff0c;需要调用第三方接口做http请求&#xff0c;但是这个请求只能在B电脑上请求。 一种解决方案&#xff1a;自定义一个中间服务&#xff0c;在电脑B上运行一个简…

正式页面开发-登录注册页面

整体路由设计&#xff1a; 登录和注册的切换是切换组件或者是切换内容&#xff08;v-if和 v-else)&#xff0c;因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页&#xff0c;有三个大模块&#xff1a;文章分类&…

RabbitMQ 学习路线与知识总结

以下是 RabbitMQ 学习路线与知识总结,结合 Mermaid 生成的脑图,帮助你系统掌握核心概念和实战技巧。 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/det…

开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…

开箱即用!一个功能丰富的 AI 语音工具箱!

当我们处理大量音频文件时&#xff0c;往往需要语音识别、转录甚至语音合成等多款工具协作完成工具。 这时候&#xff0c;要是有一款工具能够一站式解决从语音识别到语音合成的一切需求就好。 今天&#xff0c;我在 GitHub 上就发现了一款可本地部署的多功能 AI 语音工具箱&a…

部署Joplin私有云服务器postgres版-docker compose

我曾经使用过一段时间 Joplin&#xff0c;官方版本是收费的&#xff0c;而我更倾向于将数据掌握在自己手中。因此&#xff0c;在多次权衡后&#xff0c;我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连&#xff0c;下面是使用 Docker Compose 配置数据库…

【数据分析】上市公司市场势力数据测算+dofile(1992-2023年)

市场势力通常指的是公司在市场中的相对竞争力和定价能力。具有较强市场势力的公司通常能够控制价格、影响市场规则&#xff0c;并在竞争中占据主导地位。A股公司市场势力数据是对中国资本市场中公司竞争力的深入分析&#xff0c;A股市场中&#xff0c;公司市场势力的强弱不仅影…