当前位置: 首页 > wzjs >正文

武汉中小企业网站制作公司本网站三天换一次域名

武汉中小企业网站制作公司,本网站三天换一次域名,做网站的软件dw下载,如何做产品销售网站143. 最长公共子序列 方法一:记忆化搜索 一、算法逻辑(每一步思路) ❓ 问题描述: 给定两个字符串 text1 和 text2,返回它们的最长公共子序列的长度。 公共子序列:在两个字符串中都出现过,且…

143. 最长公共子序列

方法一:记忆化搜索


一、算法逻辑(每一步思路)

❓ 问题描述:

给定两个字符串 text1text2,返回它们的最长公共子序列的长度

公共子序列:在两个字符串中都出现过,且相对顺序一致,但不要求连续。


✅ 解题思路(递归 + 记忆化)

1. 状态定义:

定义 dfs(i, j) 表示:

  • text1[0..i]text2[0..j] 中的最长公共子序列的长度。
2. 状态转移:
if text1[i] == text2[j]:dfs(i, j) = dfs(i-1, j-1) + 1
else:dfs(i, j) = max(dfs(i-1, j), dfs(i, j-1))

解释:

  • 如果当前两个字符相等,则这个字符可以作为公共子序列的一部分,答案 +1;
  • 如果不相等,我们可以选择跳过一个字符,取两种可能中的最大值。
3. 终止条件(Base Case):
if i < 0 or j < 0:return 0

表示有一个字符串已经空了,公共子序列长度为 0。

4. 返回值:

最终返回 dfs(n - 1, m - 1),即原字符串全部范围的 LCS 长度。


二、算法核心点

✅ 核心技巧:记忆化搜索 + 状态递归

  • 通过 @cache 进行记忆化,避免重复计算(如果不用 cache,会超时);
  • 状态空间是 (i, j) 二维的。

这等价于二维动态规划的形式,但使用递归写法逻辑更清晰。

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:n, m = len(text1), len(text2)@cachedef dfs(i:int, j:int) -> int:if i<0 or j<0:return 0if text1[i] == text2[j]:return dfs(i-1, j-1)+1return max(dfs(i-1, j), dfs(i, j-1))return dfs(n-1, m-1)

三、复杂度分析

  • 时间复杂度:O(n * m)
    每个 (i, j) 状态只会被访问一次。
  • 空间复杂度:O(n * m)
    用于保存缓存结果(memo)和递归栈深度。

✅ 举个例子

输入:

text1 = "abcde"
text2 = "ace"

执行过程:

"abcde" 与 "ace"
比较 'e' 和 'e' -> 相等 => +1,继续比较 'd' 与 'c' ...
最终返回公共子序列是 "ace",长度为 3。

✅ 总结表

维度

内容

✅ 思路逻辑

定义 dfs(i, j):text1[0..i] 与 text2[0..j] 的 LCS 长度

✅ 状态转移

相等则 +1,否者取左/上两种子问题最大值

✅ 技巧

递归 + 记忆化(Top-down DP)

✅ 时间复杂度

O(n * m)

✅ 空间复杂度

O(n * m)

 

方法一:1:1 翻译成递推


✅ 一、核心思路解析

❓ 问题:

给定两个字符串 text1text2,找出它们的最长公共子序列的长度。


✅ 解题思路(二维 DP)

1. 状态定义:

定义二维数组 f

  • f[i][j] 表示 text1[0..i-1]text2[0..j-1] 的最长公共子序列长度。

注意这里的偏移:我们实际比较的是字符串的前 i 和前 j 个字符,但 f 的下标是从 1 开始的(第 0 行/列为 base case)。


2. 状态转移方程:
if text1[i] == text2[j]:f[i+1][j+1] = f[i][j] + 1
else:f[i+1][j+1] = max(f[i][j+1], f[i+1][j])

解释:

  • 如果两个字符相等,则这个字符可以加入公共子序列。
  • 否则,继承“去掉当前一个字符”的最优解。

3. 初始化:
f = [[0] * (m+1) for _ in range(n+1)]

第一行和第一列代表一个字符串为空时,LCS 长度为 0。


4. 最终答案:
return f[n][m]

表示完整的两个字符串的 LCS 长度。

class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:n, m = len(text1), len(text2)f = [[0]*(m+1) for _ in range(n+1)]for i,x in enumerate(text1):for j,y in enumerate(text2):if x==y:f[i+1][j+1] = f[i][j]+1else:f[i+1][j+1] = max(f[i][j+1], f[i+1][j])return f[n][m]

✅ 二、图解对比示意

假设输入:

text1 = "abcde"
text2 = "ace"

DP 表格 f:

""

a

c

e

""

0

0

0

0

a

0

1

1

1

b

0

1

1

1

c

0

1

2

2

d

0

1

2

2

e

0

1

2

3

结果是 3,对应 LCS 为 "ace"


✅ 三、复杂度分析

  • 时间复杂度:O(n * m)
    两层循环枚举所有子串组合。
  • 空间复杂度:O(n * m)
    使用了二维数组 f[n+1][m+1]

可进一步优化为 O(m) 空间,用一维滚动数组,但二维形式更直观清晰。


✅ 总结表格

项目

内容

状态定义

f[i][j]: text1 前 i 字符与 text2 前 j 字符的 LCS 长度

状态转移

如果相等:f[i+1][j+1] = f[i][j] + 1;否则:取最大

初始值

f[0][*] = f[*][0] = 0

返回值

f[n][m]

时间复杂度

O(n * m)

空间复杂度

O(n * m)(可优化)

http://www.dtcms.com/wzjs/74269.html

相关文章:

  • 网页设计网站开发培训单页网站seo优化
  • 建设银行的网站是什么情况软文推广一般发布在哪些平台
  • 深圳网站建设公司有哪些内容企业网站建设方案
  • 姜堰哪里有网站建设的东莞网络营销代运营
  • 泊头做网站的八宿县网站seo优化排名
  • 代做效果图网站哪家好每日新闻快报
  • 做设计网站模块的网站国际热点事件
  • 做维修广告在哪个网站公司网站如何制作
  • 免费网站优缺点凡科建站多少钱
  • 1元购网站怎么做今日新闻简讯30条
  • windows 2008 搭建网站软文模板300字
  • 如何做不同域名跳转同一个网站长沙网站seo收费标准
  • 网站开发能赚钱吗太原百度网站快速优化
  • 网站开发就业培训经典营销案例100例
  • 住房建设部投诉网站漂亮的网页设计
  • 深圳关键词seo西安抖音seo
  • wordpress 自定义主题seo营销是什么
  • 深圳网站定制多少钱软件开发公司
  • 保定专业网站建设黄页网推广服务
  • 网站做的好有什么用谷歌在线搜索
  • 手机网站建设推广百度搜索的优势
  • 日本的设计网站有哪些方面百度代理查询系统
  • 可以做音乐mv视频网站手机如何制作网站教程
  • 深圳有做网站的公司谷歌google官方下载
  • 杭州未来科技网站建设百度软件安装
  • 老网站301跳转新网站网站后端开发
  • wordpress 响应 主题关键词优化简易
  • 2017网站建设报价单淘宝流量助手平台
  • 长沙网站建设公司名单沧州搜索引擎优化
  • wordpress回收站做百度seo