首页 > 其他分享 >力扣718.最长重复子数组

力扣718.最长重复子数组

时间:2024-12-08 21:33:03浏览次数:5  
标签:初始化 718 int 重复子 力扣 vector dp nums1 nums2

思路:用动态规划的思路,即建立dp[n][m],其中n表示nums1的长度,m表示表示nums2的长度,

首先明确:d[i][j]的意义,他表示以nums1[i]元素结尾的字符串和以nums2[j]元素结尾的字符串他们的重复子数组的最大长度。

其次:当nums1[i]==nums2[j]时,dp[i][i]=dp[i-1][j-1]+1;

dp初始化,首先我们只初始化dp[i][0]和dp[0][j],当nums1[0]==nums2[i]时dp[0][i]=1,当nums1[i]==nums2[0]时dp[i][0]=1。其余的点先全部取0.

然后开始遍历,两层for,i=1,j=1开始。

最后找出dp数组里面的最大值即可。

代码如下:

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        int m=nums2.size();
        vector<vector<int>> dp(n,vector<int> (m,0));
        //初始化dp
        for(int i=0;i<n;i++){
            if(nums1[i]==nums2[0]){
                dp[i][0]=1;
            }
        }
         for(int i=0;i<m;i++){
            if(nums1[0]==nums2[i]){
                dp[0][i]=1;
            }
        }
        //开始遍历求解
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                if(nums1[i]==nums2[j]){
                dp[i][j]=dp[i-1][j-1]+1;
                }
            }
        }
       //查询结果
        int ans=dp[0][0];
       for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
            ans=max(ans,dp[i][j]);
            }
       }
       return ans;
    }
};

标签:初始化,718,int,重复子,力扣,vector,dp,nums1,nums2
From: https://blog.csdn.net/m0_72174153/article/details/144275755

相关文章

  • 力扣2.两数相加
    链表两数相加的问题与数组里面大数相加的问题一样。思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经......
  • 每日力扣打卡143.重排链表
    题目:给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例1:输入:head=[1,2,3,4]输出:[1,4,2,3]示......
  • 力扣打卡8:最长上升子序列
    链接:300.最长递增子序列-力扣(LeetCode)本题我开始想到的是dp,复杂度为O(n^2),这也是很经典的解法。看到进阶解法可以O(nlogn),想到可能是要用到二分,但是,我想到的是和map排序,再二分查找第一个比当前值小的数,再找比它小的所有数,中维护max序列,再塞到map中,可惜严格来讲还是O(n^2)......
  • 【特殊子序列 DP】【hard】力扣446. 等差数列划分 II - 子序列
    给你一个整数数组nums,返回nums中所有等差子序列的数目。如果一个序列中至少有三个元素,并且任意两个相邻元素之差相同,则称该序列为等差序列。例如,[1,3,5,7,9]、[7,7,7,7]和[3,-1,-5,-9]都是等差序列。再例如,[1,1,2,5,7]不是等差序列。数组中的......
  • 力扣 630课程表iii
     原题链接题解反悔贪心,或者说是贪心+优先队列。code classSolution{public:staticboolcmp(vector<int>a,vector<int>b){if(a[1]!=b[1])returna[1]<b[1];returna[0]<b[0];}intscheduleCourse(vector<vector<int>......
  • 力扣每日打卡 92.反转链表II
    题目:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例:输入:head=[1,2,3,4,5],left=2,right=4输出:[1,4,3,2,5]提示:链表中节点数目为n1<=n<=500-500<=Node.......
  • 力扣61题 -- 旋转链表(C++)
    文章目录一、题目要求二、思路分析三、代码展示一、题目要求给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]二、思路分析以......
  • 力扣 179.最大数
    原题链接题解首先,第一感觉是直接按照字符串本身大小排序再相连;但是通过样例二可知此方法错误。因此,我们重新思考,上面的排序方法错误的原因在于上述的排序满足s1<=s2,但是不满足s1+s2<=s2+s1(我们称之为加法的传递原则)。此时我们重新定义排序规则:当s1+s2<=s2+s1时就排序,否则保持......
  • 力扣 LeetCode 51. N皇后(Day14:回溯算法)
    解题思路:每次进入backtracking都表示进入下一行每个backtracking中处理当前行的各个列,看各列是否合法isValid中因为是一行一行向下遍历的,所以对应的当前行一定满足条件,没有放置过其他皇后,只需要看对应的列是否满足即可是否符合需要看左上45°和右上45°,之所以是往上看,......
  • 力扣103. 二叉树的锯齿形层次遍历
    链接:103.二叉树的锯齿形层序遍历-力扣(LeetCode)vector<vector<int>>vec;if(root==nullptr)returnvec;queue<TreeNode*>que;que.push(root);//true代表从左到右//false代表从右到左boolflag=true;while(!q......