两种思路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-27 10:48
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
评论
23
3
分享
正在热议
# 25届秋招总结 #
440428次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41455次浏览 524人参与
# 北方华创开奖 #
107295次浏览 599人参与
# 地方国企笔面经互助 #
7923次浏览 18人参与
# 虾皮求职进展汇总 #
114057次浏览 883人参与
# 实习,投递多份简历没人回复怎么办 #
2453918次浏览 34847人参与
# 阿里云管培生offer #
119796次浏览 2219人参与
# 实习必须要去大厂吗? #
55665次浏览 960人参与
# 同bg的你秋招战况如何? #
75478次浏览 551人参与
# 提前批简历挂麻了怎么办 #
149813次浏览 1977人参与
# 投递实习岗位前的准备 #
1195668次浏览 18546人参与
# 你投递的公司有几家约面了? #
33178次浏览 188人参与
# 双非本科求职如何逆袭 #
661868次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157600次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4723次浏览 54人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11332次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12405次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35599次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20087次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39225次浏览 314人参与
# 我的上岸简历长这样 #
451915次浏览 8088人参与
# 非技术岗是怎么找实习的 #
155842次浏览 2120人参与
牛客网
牛客企业服务