Maktub_Wiki Maktub_Wiki
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 第2章 算法基础

    • 2.1 插入排序
    • 2.2 算法分析
    • 2.3 设计算法
  • 第6章 堆排序

    • 6.2 维护堆的性质
    • 6.3 建堆
    • 6.4 堆排序算法
    • 6.5 优先队列
  • 第7章 快速排序

    • 7.1 快速排序的描述
  • 第8章 线性时间排序

    • 8.2 计数排序
    • 8.4 桶排序
  • 第12章 二叉树搜索

    • 12.1 什么是二叉树搜索
    • 12.3 插入和删除
  • 第13章 红黑树

    • 13.1 红黑树的性质
    • 13.2 旋转
  • 第15章 动态规划

    • 15.4 最长公共子序列
      • 说明
        • 代码
  • 第23章 最小生成树

    • 23.2 Kruskal算法和Prim算法
  • 第24章 单源最短路径

    • 24.1 Bellman-Ford算法
    • 24.3 Dijkstra算法
  • 第25章 所有结点对的最短路径问题

    • 25.2 Floyd-Warshall算法
    • 25.3 用于稀疏图的Johnson算法
  • 第31章 数论算法

    • 31.2 最大公约数
    • 31.6 元素的幂
  • 第32章 字符串匹配

    • 32.4 Knuth-Morris-Pratt算法
  • 算法导论
  • 第15章 动态规划
Maktub_小明
2024-08-18
目录

15.4 最长公共子序列

# 说明

LCS问题

# 代码

def lcs_length(X:str,Y:str)->int:
    m = len(X)
    n = len(Y)
    c = [[0] * (m+1) for _ in range(n+1)]
    b = [[0] * (m+1) for _ in range(n+1)]
    for i in range(1,n+1):
        for j in range(1,m+1):
            if X[j-1] == Y[i-1]:
                c[i][j] = c[i-1][j-1]+1
                b[i][j] = 3
            elif c[i-1][j] >= c[i][j-1]:
                c[i][j] = c[i-1][j]
                b[i][j] = 2
            else:
                c[i][j] = c[i][j-1]
                b[i][j] = 1
    # 打印LCS字符串
    print_lcs(b,X,n,m)
    return c[-1][-1]
def print_lcs(b,X,i,j):
    if i == 0 or j == 0:
        return
    if b[i][j] == 3:
        print_lcs(b,X,i-1,j-1)
        print(X[j-1])
    elif b[i][j] == 2:
        print_lcs(b,X,i-1,j)
    else:
        print_lcs(b,X,i,j-1)
X = "BDCABA"
Y = "ABCBDAB"
res = lcs_length(X,Y)
print(res)
上次更新: 2025/03/22, 03:52:10
13.2 旋转
23.2 Kruskal算法和Prim算法

← 13.2 旋转 23.2 Kruskal算法和Prim算法→

Theme by Vdoing | Copyright © 2021-2025 Maktub_小明 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式