两种思路Java

最长公共子串

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

两种实现方式可以优化哦!

第一种  字符串包含 ,内存占用较大

 maxlen :记录最长字串的长度  index:最长字串的下标

思路: str1 包含str2 中的最长字串

        int maxLength = 0;
        int index = 0;
        for(int i = 0; i < str2.length(); i++){
            for(int j = i+1; j <= str2.length(); j++){
                if(str1.contains(str2.substring(i, j)) ){
                    if(maxLength < j-i){
                        maxLength = j-i;
                        index = i;
                    }
                } else break;
            }
        }
        if( maxLength == 0 ){ //没有相同的字符串
            return "-1";
        }
        return str2.substring(index,index + maxLength);

第二种:动态规划

思路: 二维数组,  下图:str1: sabgc ,s2:abcg, 二维数组,相同的标记为1 ,不同的标0,可以看出斜对角为1 的就是最长的字串。第一个一样标记1, 第二个对角相同,值应该是x,y下标-1 的值在+1,记录的就是长度。



        if (str1 == null || str2 == null || str1.equals(" ") || str2.equals(" ")) {
            return "-1";
        }
        //动态规划  二维数组,斜下来就是最长字串
        int str1len = str1.length();
        int str2len = str2.length();
        int maxLen = 0;
        int index = 0;
//        定义一个二维数组
        int[][] dp = new int[str1len][str2len];
        //第一步:划分
        for (int i = 0; i < str1len; i++) {
            for (int j = 0; j < str2len; j++) {
                if (str1.charAt(i) == str2.charAt(j)) {
                    if (j == 0 && i == 0){
                        dp[i][j]=1;
                        maxLen = dp[i][j];
                        index = i;
                    } else{
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                        if(maxLen <= dp[i][j]){
                            maxLen = dp[i][j];
                            index = i;
                        }
                    }
                }
            }
        }
        if( maxLen==0 ){
            return "-1";
        }
        return str1.substring(index-maxLen+1,index+1);








全部评论
动态规划的解法中需修改成这样 if (str1.charAt(i) == str2.charAt(j)) { if (j == 0 || i == 0){ dp[i][j]=1; if(maxLen==0) { maxLen=1; index = i; } } else{
2 回复 分享
发布于 2021-05-12 11:26
动态规划那个根本就通不过啊
1 回复 分享
发布于 2021-04-01 19:18
动态规划的解法中,边界情况应该为i*j == 0; dp[i][j] = 1,以防止数组越界
点赞 回复 分享
发布于 2021-04-19 17:46

相关推荐

昨天 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
无情咸鱼王的秋招日记之薛定谔的Offer:R
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
永远的鹅孝子:给南大✌️跪了
点赞 评论 收藏
分享
10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
评论
23
3
分享
牛客网
牛客企业服务