IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 编辑距离问题——动态规划 -> 正文阅读

[数据结构与算法]编辑距离问题——动态规划

问题描述

给定两个字符串s和t,求利用删除、插入、替换三种操作将s替换为t串的最小编辑次数,即最短编辑距离。

动态规划代码求解

import numpy
def Minimum_Edit_Distance(s, t):
	"""

    :param s: 字符串s
    :param t: 字符串t
    :return: s和t的最小编辑距离
    """
    n = len(s)
    m = len(t)
    # 新建D[0...n,0...m]和Rec[0...n,0...m]两个二维数组
    D = [[0 for i in range(m + 1)] for j in range(n + 1)]
    Rec = [[None for i in range(m + 1)] for j in range(n + 1)]
     # 初始化
    for i in range(1, n + 1):
    	D[i][0] = i
    	Rec[i][0] = "U"
    for j in range(1, m + 1):
    	D[0][j] = j
    	Rec[0][j] = "L"
    # 动态规划
    # 依次计算子问题
    for i in range(0, n):
    	for j in range(0, m):
    		# 替换/无操作
    		c = 0
    		if s[i] != t[j]:
    			c = 1
    		replace = D[i][j] + c
    		delete = D[i][j + 1] + 1
    		insert = D[i + 1][j] + 1
    		# 采取替换操作
    		if replace == min(delete, insert, replace):
    			# 记录编辑距离和操作
    			D[i + 1][j + 1] = D[i][j] + c
    			Rec[i + 1][j + 1] = "LU"
    		# 采取插入操作
    		elif insert == min(delete, insert, replace):
    			D[i + 1][j + 1] = D[i + 1][j] + 1
    			Rec[i + 1][j + 1] = "L"
    		# 采取删除操作
    		else:
    			D[i + 1][j + 1] = D[i][j + 1] + 1
    			Rec[i + 1][j + 1] = "U"
    # 最优方案追踪
    def Print_MED(Rec, s, t, i, j):
    	"""

        :param Rec: 追踪矩阵Rec
        :param s: 字符串s
        :param t: 字符串t
        :param i: 位置索引i
        :param j: 位置索引j
        :return: 操作序列
        """
    	if i < 0 and j < 0:
    		return None
    	# 采取替换操作
    	if Rec[ i + 1][j + 1] == "LU":
    		# 递归输出子问题方案
    		Print_MED(Rec, s, t, i - 1, j - 1)
    		# 替换/无操作
    		if s[i] == t[j]:
    			print("无需操作")
    		else:
    			print(f"用{t[j]}替换{s[i]}")
    	# 采取删除操作
    	elif Rec[i + 1][j + 1] == "U":
    		Print_MED(Rec, s, t, i - 1, j)
    		print(f"删除{s[i]}")
    	# 采取插入操作
    	else:
    		Print_MED(Rec, s, t, i, j - 1)
    		print(f"插入{t[j]}")
    return f"{Print_MED(Rec, s, t, i, j)}\n递推公式表:\n{numpy.asmatrix(D)}\n 追踪数组表:\n{numpy.asmatrix(Rec)}")
if __name__ == '__main__':
	s = ["A", "B", "C", "B", "D", "A", "B"]
	t = ["B", "D", "C", "A", "B", "A"]
	print(Minimum_Edit_Distance(s, t))
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:21:37  更:2021-08-26 12:23:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:36:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码