首页 > 其他分享 >leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列

leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列

时间:2024-08-08 12:23:49浏览次数:15  
标签:1143 最长 int nums1 length 序列 leetcode nums2

leetcode 718leetcode 1143两道十分相似的题,就不放题目了

思路

实际上区别就在于一个要求连续数组,另一个要求不连续的序列。二者的dp表达式和状态转移其实是不一致的,前者f[i][j]代表nums1以i结尾nums2以j结尾的最长子数组长度,后者代表nums1以i结尾nums2以j结尾的区间内存在的最长子序列长度
曾经有人问过笔者为什么这两个表达式要定义成这样,到底什么时候用前面的方式定义,什么时候用后面的方式。嗯,实际上确实容易混淆,但仔细想想,前者若按后者方式定义,当nums1[i] == nums2[j]的话,f[i][j]要从什么状态转移过来?f[i-1][j-1]?很显然不是吧,因为你想让f[i][j] = f[i-1][j-1] + 1的前提是nums1[i-1]和nums2[j-1]是相等的,但相等么?很显然不是。没有办法合理的转移状态方程 ,所以二者的区别就在这了。说个稍微绝对点的,如果是要求连续的可以往数组的dp定义上想,如果要求是序列那就往序列的dp定义上想

题解

718

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int n = nums1.length, m = nums2.length;
        int[][] f = new int[n + 1][m + 1];
        int res = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    f[i][j] = f[i - 1][j - 1] + 1;
                } else {
                    f[i][j] = 0;
                }
                res = Math.max(res, f[i][j]);
            }
        }
        return res;
    }
}

1143

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int n = text1.length(), m = text2.length();
        int[][] f = new int[n+1][m+1];
        for (int i=1;i<=n;i++) {
            for (int j=1;j<=m;j++) {
                if (text1.charAt(i-1) == text2.charAt(j-1)) {
                    f[i][j] = f[i-1][j-1] + 1;
                } else {
                    f[i][j] = Math.max(f[i-1][j-1], Math.max(f[i-1][j], f[i][j-1]));
                }
            }
        }
        return f[n][m];
    }
}

标签:1143,最长,int,nums1,length,序列,leetcode,nums2
From: https://blog.csdn.net/pige666/article/details/140937367

相关文章

  • (nice!!!)LeetCode 3130. 找出所有稳定的二进制数组 II(动态规划dp)
    题目:3130.找出所有稳定的二进制数组II思路:大佬的思路classSolution{public:intmod=1e9+7;typedeflonglongLL;LLsta[1010][1010][2];//当前还有i个0、j个1时,第i+j的位置放置u,可以组成的合法数目LLdfs(inti,intj,intu,intlimit)......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • LeetCode150 逆波兰表达式求值
    前言题目:150.逆波兰表达式求值文档:代码随想录——逆波兰表达式求值编程语言:C++解题状态:成功解答!思路还是利用栈的思想,遍历到数字时,加入栈,遍历到运算符时,取出两个数进行运算,并将结果加入到栈中。代码classSolution{public:intevalRPN(vector<string>......
  • Leetcode 141. 环形链表(超详图解,解析过程)
    141.环形链表点击跳转leetcode原题给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos......
  • 最长上升子序列
    普通#include<iostream>usingnamespacestd;#include<algorithm>#include<cstring>constintN=5010;intn,f[N];inta[N];intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=n;i++......
  • 每日一题:Leetcode-24 两两交换链表中的节点
    力扣题目解题思路java代码力扣题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]......
  • leetcode数论(1232. 缀点成线)-几何
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给定一个数组 coor......
  • 代码随想录 day 47 回文子串 | 最长回文子序列
    回文子串回文子串解题思路dp数组的状态是判断以i结尾,j开始的字符串是否为回文,用bool类型存储,之后当i和j的字符串相等时,通过计算它们之间的距离和判断它们之间是否为回文串来进行递归。知识点回文,动态规划心得如果不看题解根本想不到怎么做最长回文子序列最长回文子序列......
  • 《LeetCode热题100》---<5.②普通数组篇五道>
    本篇博客讲解LeetCode热题100道普通数组篇中的五道题第三道:轮转数组(中等)第四道:除自身以外数组的乘积(中等)第三道:轮转数组(中等) 方法一:使用额外的数组classSolution{publicvoidrotate(int[]nums,intk){intlen=nums.length;int[]newAr......
  • LeetCode-两数相加
    前言这道题将整数加法转换为在单链表上做加法运算,涉及到知识点:单链表的遍历单链表插入新节点题目描述给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。示例1:输入:l1=[2,4,3],l2=[5,6,4]输出:[7,0,8......