Lintcode(5)-最长公共子串

Q:
给出两个字符串,找到最长公共子串,并返回其长度。
给出A=“ABCD”,B=“CBCE”,返回 2
子串的字符应该连续的出现在原字符串中,这与子序列有所不同。
A:
可以使用动态规划让时间复杂度降至O(n²)
关于动态规划这篇文章写得很好很强大!
这里使用最原始的办法,时间复杂度O(n³)

class Solution {
public:
    /**
     * @param A, B: Two string.
     * @return: the length of the longest common substring.
     */
    int longestCommonSubstring(string &A, string &B) {
        std::size_t a_len = A.length();
        std::size_t b_len = B.length();
        if (!a_len || !b_len) {
            return 0;
        }
        std::size_t a_start = std::string::npos;
        std::size_t b_start = std::string::npos;
        std::size_t longest = 0;
        for (std::size_t i = 0; i < a_len; ++i) {
            for (std::size_t j = 0; j < b_len; ++j) {
                std::size_t this_l = 0;
                std::size_t this_i = i;
                std::size_t this_j = j;
                for (; this_i < a_len && this_j < b_len; this_i++, this_j++) {
                    if (A[this_i] == B[this_j])
                        this_l++;
                    else
                        break;
                }
                if (this_l > longest) {
                    longest = this_l;
                    a_start = this_i;
                    b_start = this_j;
                }
            }
        }
        return longest;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值