Java最大公共子串(动态规划)

举报
红目香薰 发表于 2022/01/22 00:40:21 2022/01/22
【摘要】 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:“abcdkkk” 和 “baabcdadabc”, 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分...

最大公共子串长度问题就是:

求两个串的所有子串中能够匹配上的最大长度是多少。

比如:“abcdkkk” 和 “baabcdadabc”,
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

请分析该解法的思路,并补全划线部分缺失的代码。

这个有点dp的意思,分别计算两个字符串每一个字符到另一个字符是否相等 若相等 则加前面字符的最大字符串 若前面字符也分别相等则他就等于a[i-1][j-1]+1 若不想等则为0+1

 测试数据1:


  
  1. abcdkkk
  2. baabcdadabc

 



  
  1. import java.util.Scanner;
  2. public class Main {
  3. static Scanner sc =new Scanner(System.in);
  4. static int f(String s1, String s2) {
  5. char[] c1 = s1.toCharArray();
  6. char[] c2 = s2.toCharArray();
  7. int[][] a = new int[c1.length + 1][c2.length + 1];
  8. int max = 0;
  9. for (int i = 1; i < a.length; i++) {
  10. for (int j = 1; j < a[i].length; j++) {
  11. if (c1[i - 1] == c2[j - 1]) {
  12. a[i][j] = a[i - 1][j - 1] + 1; //填空处
  13. if (a[i][j] > max)
  14. max = a[i][j];
  15. }
  16. }
  17. }
  18. return max;
  19. }
  20. public static void main(String[] args) {
  21. int n = f(sc.next(), sc.next());
  22. System.out.println(n);
  23. }
  24. }

文章来源: laoshifu.blog.csdn.net,作者:红目香薰,版权归原作者所有,如需转载,请联系作者。

原文链接:laoshifu.blog.csdn.net/article/details/117386434

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。