LeetCode热题100-最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

首先明确概念字串是连续的字符,子序列是不保证连续,但是保证前后顺序。经典二维 DP 题,

核心思路

  • 状态:dp[i][j] 表示 text1[0..i-1] 和 text2[0..j-1] 的最长公共子序列长度
  • 转移:
    • 字符相等:dp[i][j] = dp[i-1][j-1] + 1
    • 不等:dp[i][j] = max(dp[i-1][j], dp[i][j-1])
python 复制代码
      空  a  c
空    0  0  0
a     0  1  1
b     0  1  1
c     0  1  2
python 复制代码
class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        m = len(text1)
        n = len(text2)

        dp = [[0] * (n + 1) for _ in range(m + 1)]

        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if text1[i -1] == text2[j - 1]:
                    dp[i][j] = dp[i -1][j - 1] + 1
                else:
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
        
        return dp[m][n]
相关推荐
乌暮3 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
行者-全栈开发3 小时前
【前端/JS框架】CVE-2026-3854:GitHub Enterprise Server X-Stat注入XSS漏洞深度剖析与紧急修复指南
前端·javascript·github
大猫和小黄3 小时前
深入理解 Java Optional:从设计哲学到工程实战
java
数据库百宝箱3 小时前
rum&gin索引对比
java·数据库·gin
2601_962218613 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程3 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
yychen_java3 小时前
第六篇:Spring AI 实战:将 Java 业务接口封装成企业级 MCP Server
java·人工智能·spring
jimy14 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
计算机魔术师4 小时前
AMD砸82亿买下李飞飞,这次不卖芯片卖什么?
前端
_upupup4 小时前
异常(C++)
java·开发语言·jvm