LeetCode 718. 最长重复子数组/最长公共子串(C++)

本文介绍了解决最长公共子数组问题的三种方法:暴力求解、滑动窗口和动态规划,并对比了各自的优缺点及执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:力扣

题目难度:Medium

涉及知识点:动态规划、滑动窗口


分析:若把题目中的数组换成字符串,那么这道题就变成了最长公共子串问题。与最长公共子序列不同,子串要必须连续。

解法1:暴力求解

思路:先固定第一个数组的值遍历第二个数组,若发现比较的两个元素相等,则使用临时变量来一起往后看,看最长多少位相等,更新全局最大解;再继续遍历第一个数组的值,直到遍历不可能再出现更长的为止。

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        // 定义数组大小以及全局最大解
        int sz1 = nums1.size(), sz2 = nums2.size();
        int max_len = 0;
        // 遍历数组1,当发现后面剩下的元素不足以超过最大值的时候就跳出循环
        for (int i = 0; i < sz1-max_len; ++i)
        {
            // 遍历数组2
            for (int j = 0; j < sz2; ++j)
            {
                // 若当前元素相等
                if (nums1[i] == nums2[j]) {
                    int cur_len = 0;
                    int tmp1 = i, tmp2 = j;
                    // 则一起往后看最高有多少位相等
                    while (tmp1 != sz1 && tmp2 != sz2 && nums1[tmp1] == nums2[tmp2])
                    {
                        ++cur_len, ++tmp1, ++tmp2;
                    }
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值