牛客网求最长公共子串问题

题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
示例1
输入:
“1AB2345CD”,“12345EF”
返回值:
“2345”
解题思想:
本题采用动态规划方法解答,我使用的是java语言。首先用StringBuilder创建一个动态字符数组的对象。用来存储公共子串。
在定义子串的起始位置和终止位置,循环条件是终止位置超过了其中一个字符串的长度,先判断字符串2时候包含字符串一的子串,如果包含则再判断是否是最大子串,是,则删除之前字串重新添加,不是则终止位置往后移动一位。直到移动到字符串末尾为止。
下面是展示代码:

public static String LCS (String str1, String str2) {
        // write code here
        StringBuilder sq1 = new StringBuilder();
        int start = 0, end = 1;
        while (end < str1.length() + 1) {
            if (str2.contains(str1.substring(start, end))) {
                //判断是否比之前的子串还长。
                if (sq1.length() < end - start) {
                    //如果大于之前的子串则重新添加
                    sq1.delete(0, sq1.length());
                    sq1.append(str1, start, end);
                }
                end++;
            } 
            else {
                start++;
            }
        }
        if (sq1.length() == 0) {
            return "-1";
        }
        return sq1.toString();
    }

每个字符串必然包含一个空字符,所以当start=end时字符串一和字符串二必然是包含关系,所以不会出现start>end的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值