【刷题笔记】动态规划

阅读: 评论:0

【刷题笔记】动态规划

【刷题笔记】动态规划

题目描述

对于字符串str1,和字符串str2,现在要求最少通过多少次操作可以将str1转变为str2.其中一次操作是对一个字符进行 添加、删除和更改。
例如:str1 = ”abcd“,str2=“bd” res=2(删除a、删除c)

解题思路

这种类似于对字符串进行操作,求最值的问题十有八九会是动归的考点。但是令人比较头疼的是状态转移方程怎么搞定。

我们规定len1=len(str1);len2 = len(str2)。我们可以创建一个len1 x len2的矩阵edit_nums来记录最少的修改次数。M(i,j)表示对于字符串str1的字串从0到i转换成str2的从0到j的子串最少的次数。

根据题目的意思,
对记录矩阵M进行初始化:
M(0,:)等于str2子串的长度和M(:,0)等于str1的子串长度,即M(0,j) = len(str2[:j]) = j
M(i,0)=i
状态转移方程:
根据题目的意思,状态转移方程应该包含三项
增加一个元素:M(i,j)= M(i,j - 1) + 1
删除一个元素: M(i,j)= M(i - 1,j) + 1
更改或者不更改元素:M(i,j)= M(i - 1,j - 1)+ flag。当str1[i] == str2[j]时,flag=0(不对新增元素进行改动).当str1[i] != str2[j]时,flag=1(对新增元素改动).
综上所述,M(i,j) = min [M(i,j - 1) + 1,M(i - 1,j) + 1,M(i,j)= M(i - 1,j - 1)+ flag]

def leastAlta(str1,str2):len1,len2 = len(str1),len(str2)edit_nums = []for _ in range(len1):nums = [0] * len2edit_nums.append(nums)for i in range(len1):edit_nums[i][0] = ifor i in range(len2):edit_nums[0][i] = ifor i in range(1,len1):for j in range(1,len2):if str2[j] == str1[i]:flag = 0else:flag = 1res0 = [edit_nums[i - 1][j] + 1, edit_nums[i][j-1] + 1,edit_nums[i - 1][j - 1] + flag]edit_nums[i][j] = min(res0)return edit_nums[-1][-1]

本文发布于:2024-01-31 12:41:59,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170667612028595.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:笔记   动态
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23