最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence)

本文探讨了字符串处理中的两个重要概念——最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence)。最长公共子串是指在两个或多个字符串中存在相同的连续字符序列,而最长公共子序列则不要求连续。两者都是通过动态规划方法求解。参考链接提供了详细解释。
摘要由CSDN通过智能技术生成

最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence)

参考文章https://blog.csdn.net/u013309870/article/details/69479488

最长公共子串(Longest Common Substring)

/**
     * 要求:求两个字符串的最长公共子串,如text1="12345abc",text2="2d3e45fabc",则二者的最长公共子串为"abc"
     * @param text1 字符串1,String类型
     * @param text2 字符串2,String类型
     * @return 公共字串,String类型;稍加修改就能返回长度
     * 方法:动态规划,填表,text1为纵轴,text2为横轴,dp[i][j]表示text1的前i个字符和text2的前j个字符的最大公共子串长度
     * 计算dp[i][j] 的步骤如下:
     * ①矩阵dp的第一列 dp[0…m-1][0].对于 某个位置(i,0)如果text1[i]==text2[0],则dp[i][0]=1,否则dp[i][0]=0
     * ②矩阵 dp 的第一行 dp[0][0…n-1].对于 某个位置(0,j)如果text1[0]==text2[j],则dp[0][j]=1,否则dp[0][j]=0
     * ③其他位置从左到右从上到下计算,dp[i][j]的值只有两种情况:
     * 1). text1[i]==text2[j],dp[i][j]=dp[i-1][j-1]+1;
     * 2). text1[i]!=text2[j]则dp[i][j]=0;
     * 这里dp[i][j]表示以j(i也一样)下标对应的字符为公共子串结尾的子串的长度,如果不是子串结尾即text1[i]!=text2[j],则dp[i][j]=0
     */
    public static String longestCommonSubString(String text1, String text2) {
   
        if (text1 == null || text2 == null || text1.length() == 0 || text2.length() == 0) {
   
            return "";
        }
        // 动态规划数组dp,行数为text1的长度,列数为text2的长度
        int[][] dp = new int[text1.length()][text2.length()];
        // 字串的最大长度
        int max = 0;
        // 记录公共子串最后一个字符在text1中的位置
        int index = -1;
        // 初始化dp的首
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值