最长公共子串
题目:
[编程题]最长公共子串
题解:
对比:1143. 最长公共子序列
借助一下《图解算法》中的例子。假设对于两个字符串 fish 和 hish,我们可以绘制一个这样的表格,来求解它们最长的公共子串,即:
注意,最长公共子串的最终答案并不一定在最后一个格子里,所以我们还需要一个变量 max 来记录最大值。
注意:
如果我们还需要知道具体的最长公共子串是什么,那么就需要再添加一个变量,记录最大值出现的位置,然后往前取最长公共子串的长度即可。
代码:
public class 最长公共子串 {
public static int findLongest(String A, int n, String B, int m) {
// dp[i][j] 表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子串的长度。
int dp[][] = new int[n + 1][m + 1];
int max = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
// 当 S1.i == S2.j 时,那么就能在 S1 的前 i-1 个字符与 S2 的前 j-1 个字符最长公共子串的基础上再加上 S1.i 这个值,最长公共子串长度加 1.
if(A.charAt(i - 1) == B.charAt(j - 1))
{
dp[i][j] = dp[i- 1][j - 1] + 1;
max = Math.max(max, dp[i][j]);
}
// 当 S1.i != S2.j 时,此时最长公共子串为0
else
{
dp[i][j] = 0;
}
}
}
// 对于长度为 N 的子串 S1 和长度为 M 的子串 S2,max 就是子串 S1 和子串 S2 的最长公共子串长度。
return max;
}
public static void main(String[] args) {
String text1 = "1AB2345CD";
int n = 9;
String text2 = "12345EF";
int m = 7;
int res = findLongest(text1, n, text2, m);
System.out.println(res);
}
}
参考:
- 动态规划:最长公共子串 & 最长公共子序列
- 笔试面试算法经典–最长公共子串(Longest Common SubString)
还没有评论,来说两句吧...