动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或分治)的方式去解决。
适用动态规划解决的问题特点:最优化原理、最优化原理、有重叠子问题。
目标:给定两个字符串s1和s2以及编辑操作(如下所示)。编写算法以查找将字符串s1转换为s2所需的最小数目的运算。
允许的操作:
- 插入–插入新字符。
- 删除–删除字符。
- 替换–将一个字符替换为另一个字符。
例:
字符串s1 =“ hoome”
字符串s2 =“ home”
输出:1 {从字符串s1删除'o'}
字符串s1 =“ like”
字符串s2 =“ likely”
输出:2 {插入'l','y'字符}
方法:
开始同时比较两个字符串中的一个字符。在这里,我们从右到左(向后)比较字符串。
现在,对于每个字符串,我们有两个选择:
- 如果两个字符串中的最后一个字符相同,则忽略该字符并递归求解其余字符串。
- 否则,如果两个字符串中的最后一个字符都不相同,那么我们将尝试所有可能的操作(插入,替换,删除),并针对每种可能性递归地获取其余字符串的解决方案,并从中选择最小值。
假设给定的字符串分别是s1和s2,长度分别为m和n。
- 情况1:最后一个字符相同,忽略最后一个字符。
- 递归求解m-1,n-1
- 情况2:最后一个字符不同,然后递归尝试所有可能的操作。
- 将一个字符插入s1(与字符串s2中的最后一个字符相同,以便两个字符串中的最后一个字符相同):现在s1的长度为m + 1,s2的长度为n,忽略最后一个字符,然后递归求解m,n -1。
- 从字符串s1删除最后一个字符。现在s1长度将是m-1,s2长度:n,递归求解m-1,n。
- 将最后一个字符替换为s1(与字符串s2中的最后一个字符相同,以便两个字符串中的最后一个字符相同):s1的长度为m,s2的长度为n,忽略最后一个字符,然后递归求解m-1,n- 1。
选择(a,b,c)中的最小值。
首先,我们将看到递归解决方案,然后将通过使用动态编程降低其复杂性来改进解决方案。
因此,在最坏的情况下,我们需要对字符串的每个字符执行操作,因为我们有3次操作,所以时间复杂度将为O(3 ^ n)。
让我们看看是否存在重叠的子问题。
例:
字符串s1:“ CAT”字符串s2:“ DOG”
正如我们看到的那样,有很多子问题可以反复解决,因此在这里有很多重叠的子问题。我们可以用它解决动态规划 中自下而上的方式。我们将解决问题并将其存储到数组中,并根据需要使用解决方案,以确保每个子问题仅被解决一次。
注意:
在 计算机科学中,编辑距离是 一种通过计算将一个字符串转换为另一个字符串所需的最小操作数来量化两个字符串(例如单词)彼此之间有多么不同的方式 。编辑距离可以在自然语言处理中找到应用程序 ,其中自动 拼写校正 可以通过从字典中选择与所讨论单词的距离较小的单词来确定拼写错误的单词的候选者更正。在 生物信息学中,它可以用于量化DNA 序列的相似性 ,可以将其视为字母A,C,G和T的字符串。