最长公共子串

男娘i 2022-12-07 15:23 259阅读 0赞

题目:

[编程题]最长公共子串
在这里插入图片描述

题解:

对比:1143. 最长公共子序列

借助一下《图解算法》中的例子。假设对于两个字符串 fish 和 hish,我们可以绘制一个这样的表格,来求解它们最长的公共子串,即:
在这里插入图片描述
注意,最长公共子串的最终答案并不一定在最后一个格子里,所以我们还需要一个变量 max 来记录最大值。

注意:

如果我们还需要知道具体的最长公共子串是什么,那么就需要再添加一个变量,记录最大值出现的位置,然后往前取最长公共子串的长度即可。

代码:

  1. public class 最长公共子串 {
  2. public static int findLongest(String A, int n, String B, int m) {
  3. // dp[i][j] 表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子串的长度。
  4. int dp[][] = new int[n + 1][m + 1];
  5. int max = 0;
  6. for(int i = 1; i <= n; i++)
  7. {
  8. for(int j = 1; j <= m; j++)
  9. {
  10. // 当 S1.i == S2.j 时,那么就能在 S1 的前 i-1 个字符与 S2 的前 j-1 个字符最长公共子串的基础上再加上 S1.i 这个值,最长公共子串长度加 1.
  11. if(A.charAt(i - 1) == B.charAt(j - 1))
  12. {
  13. dp[i][j] = dp[i- 1][j - 1] + 1;
  14. max = Math.max(max, dp[i][j]);
  15. }
  16. // 当 S1.i != S2.j 时,此时最长公共子串为0
  17. else
  18. {
  19. dp[i][j] = 0;
  20. }
  21. }
  22. }
  23. // 对于长度为 N 的子串 S1 和长度为 M 的子串 S2,max 就是子串 S1 和子串 S2 的最长公共子串长度。
  24. return max;
  25. }
  26. public static void main(String[] args) {
  27. String text1 = "1AB2345CD";
  28. int n = 9;
  29. String text2 = "12345EF";
  30. int m = 7;
  31. int res = findLongest(text1, n, text2, m);
  32. System.out.println(res);
  33. }
  34. }

参考:

  1. 动态规划:最长公共子串 & 最长公共子序列
  2. 笔试面试算法经典–最长公共子串(Longest Common SubString)

发表评论

表情:
评论列表 (有 0 条评论,259人围观)

还没有评论,来说两句吧...

相关阅读

    相关 公共

    最长公共子串(注意子串是连续的,也是与最长公共子序列的区别) 1、先建立一个二维数组array\[str1.size()\]\[str2.size()\](全部初始化为0