首页 > 其他分享 >1143. 最长公共子序列(leetcode)

1143. 最长公共子序列(leetcode)

时间:2024-09-07 15:38:55浏览次数:3  
标签:1143 int nums1 text2 length 序列 leetcode nums2

https://leetcode.cn/problems/longest-common-subsequence/description/
经典题,老题回顾

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        // f[i][j]表示所有在第一个序列前i个数中选择,在第二个序列前j个数中选择得到的最长子序列,即最长公共子序列
        // 那么答案就是f[nums1.length][nums2.length]
        // 以nums1[i],nums2[j]是否选择来划分,那么就有四种情况,划分成四个子集
        // nums1[i],nums2[j]都不选
        // f[i][j]=f[i-1][j-1] // 这里可以忽略,因为后续的f[i-1][j]或者f[i][j-1]都是f[i-1][j-1]的超集
        // nums1[i],nums2[j]都选(这里都选就必须nums1[i]==nums2[j],因为是公共的)
        // f[i][j]=f[i-1][j-1]+1
        // nums1[i]选,nums2[j]不选 或者 nums1[i]不选.nums2[j]选
        // 这两种情况不好直接判断,只能使用f[i-1][j],f[i][j-1]来替代求答案
        // 因为f[i-1][j]是表示在前i-1中选择,前j中进行选择,不一定选择第j个,集合并不等价,而是父子集关系
        // 但是由于是题意求最大长度,那么父集合的最大长度是>=子集合最大长度的 , f[i][j-1]同理
        // 因此可以直接使用,而不用管递推是否合法
        // 因此f[i][j]=max(f[i-1][j-1]+1,f[i-1][j],f[i][j-1])
        // 初值全0即可,都合法
        
        int[][] f=new int[text1.length()+1][text2.length()+1];
        char[] t1=text1.toCharArray();
        char[] t2=text2.toCharArray();

        for(int i=1;i<=t1.length;i++)
        {
            for(int j=1;j<=t2.length;j++)
            {
                f[i][j]=Math.max(f[i-1][j],f[i][j-1]);
                if(t1[i-1]==t2[j-1])f[i][j]=Math.max(f[i][j],f[i-1][j-1]+1);
            }
        }
        return f[t1.length][t2.length];
    }
}

 

标签:1143,int,nums1,text2,length,序列,leetcode,nums2
From: https://www.cnblogs.com/lxl-233/p/18401726

相关文章

  • LeetCodeTest算法测试 传递一个数组和一个特定的目标整型数字,返回的两个数组元素相加
    1importjava.util.ArrayList;2importjava.util.List;34publicclassLeetCodeTest{5publicstaticvoidmain(String[]args){67int[]intArr=newint[]{2,7,11,15};8List<CustomerIntIndex>customerIntIndexL......
  • 718. 最长重复子数组(leetcode)
    https://leetcode.cn/problems/maximum-length-of-repeated-subarray/难点是在于状态定义,需要考虑到以第i个数为结尾,以第j个数为结尾的最长重复子数组这样的定义而递推就很简单,只需要发生重复时+1即可,和之前的一维的,即最长子数组一样classSolution{publicintfind......
  • 674. 最长连续递增序列(leetcode)
    https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/classSolution{publicintfindLengthOfLCIS(int[]nums){//f[i]表示以第i个数为结尾的最长连续递增序列//以倒数第2个数划分子集//f[i]=if(nums......
  • 300. 最长递增子序列(leetcode)
    https://leetcode.cn/problems/longest-increasing-subsequence/description/classSolution{publicintlengthOfLIS(int[]nums){//f[i]表示以第i个数为结尾的最长严格上升子序列//以倒数第二个数是多少来划分子集//f[i]=max(f[i-1],f[......
  • 714. 买卖股票的最佳时机含手续费(leetcode)
    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/classSolution{publicintmaxProfit(int[]prices,intfee){//f[i][j]表示前i天进行交易购买,j=0表示持有股票,j=1表示未持有股票,划分两个状态//f[i][0]=......
  • 求出最长好子序列
    给你一个整数数组nums和一个非负整数k。如果一个整数序列seq满足在范围下标范围[0,seq.length-2]中存在不超过k个下标i满足seq[i]!=seq[i+1],那么我们称这个整数序列为好序列。请你返回nums中好子序列的最长长度1.动态规划dp[i][j]表示将把i作为序......
  • 如何快速求一个序列的gcd和lcm
    背景:教授在打某道关于序列gcd与lcm的题,但是看不懂题解,于是决定打表找规律;然而自己又懒得算数,于是写了个程序。使用说明:输入格式:nstra1a2...an,\(n\)为序列长度;str为操作种类,只有GCD和LCM;\(a\)为序列,其中所有元素都必须是自然数。如果输入不合法,程序会中断计算并返回错误......
  • Leetcode算法挑战:详解如何实现交替合并字符串的解题思路
    Leetcode算法挑战中的“交替合并字符串”问题,要求我们将两个字符串以交替的方式合并,终形成一个新的字符串。乍一看,这道题目似乎不复杂,但要写出高效且简洁的解法,还需要一定的思路和技巧。一、问题描述题目要求给定两个字符串word1和word2,将它们按照索引依次交替合并。如果某个......
  • LeetCode刷题-栈
    一:栈1、栈的特性:栈和队列不一样;队列是先进先出;而队列是先进后出;后进后出!2、栈的常见操作defcreate_stack():stack=[]#在python中;通常用列表实现栈的操作returnstackdefpush(stack,data):stack.append(data)#将data压入栈中defpeek(stack):returnsta......
  • 算法练习小技巧之有序集合--套路详细解析带例题(leetcode)
    前言:    本文详细讲解Python中的有序集合SortedList和C++中的有序集合multiset的用法,配合leetcode的例题来展示实际的用处。(本人水平不够,还无法讲解有序集合的实现方法,只会用)    觉得有帮助或者写的不错可以点个赞,后面也有几道我找出来的题目可以用这个方......