题解 | #最长公共子串#

最长公共子串

https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac

用到了 动态规划

最终结果是由 下一级结果累计 获取的。

首先需要创建一个 二维数组,大小就是arr[字符串1的长度][字符串2的长度]

这题动态规划的思想就是 如果存在公共子串,比如"1AB2345CD","12345EF"的公共子串2345

那么比如"1AB2345CD"中公共子串2345最后一个 值5的下标是7,对应的"12345EF"公共子串2345最后一个值5的下标是5,两个字符串 5的前一个值4 肯定也是相等的,下标分别是6和4 。 所以可以知道值5 的最大长度是 值4 最大长度+1, 同理,两个字符串 值为3 对应的下标是 5和3 ,值为4的最大长度是值3 最长度+1 ,

也就是说,i代表的是 字符串1的下标、j代表的是字符串2的下标,如果她两字符相等,他们最大公共子串长度是 字符串1下标为i-1 ,字符串2下标为j-1 的最大公共子串长度 +1.

for循环

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    public String LCS (String str1, String str2) {
        int[][] data= new int[str1.length()+1][str2.length()+1]; 
        int maxlength =0;
        int index =0;
        for(int i = 0;i<str1.length();i++){
            for(int j = 0;j<str2.length();j++)
            {
                if(str1.charAt(i)!=str2.charAt(j))
                {
                    data[i][j] = 0;
                }
                else{
                    if(i==0||j==0){
                        data[i][j]=1;
                    }
                    else{
                        data[i][j] = data[i-1][j-1] +1;
                    }
                    if(maxlength <data[i][j])
                    {
                        maxlength = data[i][j];
                        index = i;
                    }
                }

            }

        }
        return str1.substring(index-maxlength+1,index+1);
    }
}

全部评论

相关推荐

鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务