题解 | #最长公共子串#

最长公共子串

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);
全部评论

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务