题解 | #最长公共子串#

最长公共子串

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

index和maxLength是参考了其他大佬的操作,以及返回的str1.substring(index-maxLength+1,index+1);
这里的循环其实可以从dp[0][0]开始,需要判断i==0||j==0,单独弄出来处理会比较更容易明白吧(对我而言)

题目保证str1和str2的最长公共子串存在且唯一。
所以这里没有处理临界值(是否为空字符串),要处理的话用一个 if(str==null || str.equals(" "))判断应该就行了。

附上图片以助理解:
图片说明

代码:

public String LCS (String str1, String str2) {
        // write code here
        int [][]dp=new int[str1.length()][str2.length()];   //根据字符串长度创建二维数组
        int maxLength=0; //长度
                int index = 0;//下标

//    处理边界条件 i=0 || j=0
        for(int i=0;i<str1.length();i++){
            if(str1.charAt(i)==str2.charAt(0)){dp[i][0]=1;
                                               maxLength=dp[i][0];
                                               index=i;
                                              } 
            else{
                dp[i][0]=0;
            }
        } 

        for(int i=0;i<str2.length();i++){
            if(str1.charAt(0)==str2.charAt(i)){dp[0][i]=1; maxLength=dp[0][i];index=i;} 
            else{
                dp[0][i]=0;

            }
        }

        //从dp[1][1]开始循环
        for(int i=1;i<str1.length();i++){
            for(int j=1;j<str2.length();j++){
                if(str1.charAt(i)==str2.charAt(j)){
                    dp[i][j]=dp[i-1][j-1]+1;
                    if(maxLength<=dp[i][j]){ maxLength=dp[i][j];index=i;}
                }else{
                    dp[i][j]=0;
                } 
            }
        }
        return str1.substring(index-maxLength+1,index+1);
全部评论

相关推荐

05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
吴offer选手:下午mt一来就告警说项目来不及,估计明天拿了权限就要参与开发了 已老实
实习生的蛐蛐区
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 13:41
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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