美文网首页
查找两个字符串中的最长公共子串

查找两个字符串中的最长公共子串

作者: 鸡杂面 | 来源:发表于2019-10-11 17:11 被阅读0次

思路:(动态规划)

用二维矩阵来储存两个字符串间字符是否相等的信息
直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")


图片.png

我们看矩阵的斜对角线最长的那个就能找出最长公共子串。

不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。

图片.png

这样矩阵中的最大元素就是 最长公共子串的长度。

java实现

  1. 重要的方法
  • String类.charAt(index),值为该字符串此位置的字符。
    示例:String a = "abc"; a.charAt(2)的值为c;
  • String类.substring(start,end); 左必右开[start,end),值为该字符串此段区域的字符串
    示例:String a = "abcde"; a.substring(1,4)的值为bcd;
public class MaxGonggongZIChuang {
    public static String maxSubstring(String a, String b) {
         //检查参数
        if(a == null || b == null) {
            return null;
        }
        
      //记录两个字符串的长度,创建二维数组
        int length1 = a.length();
        int length2 = b.length();
        int[][] arrs = new int[length1][length2];
    //用来记录最大公共子串的最后一个字符的位置
        int lastIndex = 0;
    //用来记录最大公共子串的长度
        int maxLength = 0;
        for(int i = 0; i < length1; i++) {
            for(int j = 0; j < length2; j++) {
                if(a.charAt(i) == b.charAt(j)) {
                       //当相等的位置在上边界和左边界时,没有左上角的数,记录的长度置1
                    if(i == 0 || j == 0) {
                        arrs[i][j] = 1;
                    }else {
                       //记录的长度等于左上角加1
                        arrs[i][j] = arrs[i - 1][j - 1] + 1;
                    }
                      //更新最长公共子串位置和长度信息
                    if(maxLength < arrs[i][j]) {
                        maxLength = arrs[i][j];
                        lastIndex = i;
                    }
                }
            }
        }
        //长度为0时,表示没有公共子串,返回null
        if(maxLength == 0) {
            return null;
        }
        return a.substring(lastIndex + 1 - maxLength, lastIndex + 1);
    }
    public static void main(String[] args) {
        String a = "123456789";
        String b = "123567894567";
        System.out.println(maxSubstring(a,b)); 
    }
}

相关文章

  • JS求最长公共子序列、最大公共子串、最大子段和

    一、最长公共子序列 二、最大公共子串 三、最大子段和 参考链接:查找两个字符串的最长公共子串的Javascript...

  • 练习

    查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

  • 2018-08-09

    动态规划之最长公共子序列 问题描述 给定两个字符串,求解两个字符串的最长公共子序列。比如字符串1:BDCABA;字...

  • 【python】求两个字符串的公共字串?

    题目:找出两个字符串的最长公共字串,例如字符串“abccade”与字符串“dgcadde”的最长公共子串为“cad...

  • 每天一道算法题18

    【最长公共子序列,子串】给定两个字符串上str1 和 str2, 求两个字符的最长公共子序列和最长公共子串。 最长...

  • 最长公共子序列问题解析

    问题解读 最长公共子序列问题,就是找出两个字符串中,存在的最长的子序列 什么是子序列呢?子序列不同于公共子串,子串...

  • 5,最长公共前缀/数组与字符串

    最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1:...

  • Swift 最长公共前缀 - LeetCode

    题目: 最长公共前缀 描述: 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""...

  • leetcode探索之旅(14)

    最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例 1: ...

  • Leetcode 14 最长公共前缀

    最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例...

网友评论

      本文标题:查找两个字符串中的最长公共子串

      本文链接:https://www.haomeiwen.com/subject/rvhxmctx.html