最长公共连续子串-Java

该博客讨论了如何在Java中找到两个字符串的最长公共连续子串。它介绍了问题描述,输入输出格式,并提供了使用动态规划的解决方案。通过动态规划状态转移方程dp[i][j]=dp[i-1][j-1]+1来求解,以找到最长公共子串的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。
例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。
现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。

输入描述:

输入为两行字符串(可能包含空格),长度均小于等于50.

输出描述:

输出为一个整数,表示最长公共连续子串的长度。

示例1

输入

abcde
abgde

输出

2

思路

  1. 常规解法:假设有两个字符串A(长度5),字符串B(长度3),因为B的长度为3,那么最长的公共连续子串的长度最大的情况也只可能是3,所以可以从最短长度那个字符串开始递推,字符串B中,列举长度为3的连续子串,长度为2的连续子串,长度为1的连续子串。从3开始,在字符串A中找是否包含B中长度为3的子串,如果包含,那么就可以终止,结果那就是3,不需要再找长度为2的子串,如果不包含,再找长度为2的子串。。。直到长度为0 ,终止查找。
  2. 动态规划解法:有状态转移方程:dp[i][j]=dp[i-1][j-1]+1;

实例:A:acdf;B:adfa

0 a c d f
a 1 0 0 0
d 0 0 1 0
f 0 0 0 1
a 1 0 0 0

对角线累加

0 a c d f
a 1 0 0 0
d 0 0 1
### Java 实现最长公共子串 LeetCode 题解 对于寻找两个字符串之间的最长公共子串问题,在处理过程中通常采用动态规划方法来解决。该算法通过构建一个二维数组 `dp` 来记录两个字符串之间字符匹配的情况。 具体来说,当遍历到 `text1[i-1] == text2[j-1]` 时,则有 `dp[i][j] = dp[i-1][j-1] + 1` 表明当前字符相等并延续之前的连续相同字符计数;如果不相等则设置为零因为这里关注的是连续相同的子串而非子序列[^1]。 下面是一个完整的解决方案: ```java class Solution { public String longestCommonSubstring(String str1, String str2) { int m = str1.length(); int n = str2.length(); // 创建DP表 int[][] dp = new int[m + 1][n + 1]; // 记录最大长度及其结束位置 int maxLength = 0; int endIndex = -1; for (int i = 1; i <= m; ++i){ char c1 = str1.charAt(i - 1); for (int j = 1; j <= n; ++j){ char c2 = str2.charAt(j - 1); if(c1 == c2){ dp[i][j] = dp[i - 1][j - 1] + 1; if(dp[i][j] > maxLength){ maxLength = dp[i][j]; endIndex = i - 1; } }else{ dp[i][j] = 0; } } } // 如果找到了有效结果就截取出来作为最终答案 return maxLength != 0 ? str1.substring(endIndex - maxLength + 1,endIndex + 1): ""; } } ``` 此代码实现了上述逻辑,并能够有效地找出给定两字符串间的最长公共子串。注意这里的实现方式与最长公共子序列不同之处在于一旦遇到不匹配即重置计数值为零以确保只考虑连续部分[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值