行编辑距离Edit Distance——动态规划

题目描写叙述:

给定一个源串和目标串。可以对源串进行例如以下操作:

1. 在给定位置上插入一个字符

2. 替换随意字符

3. 删除随意字符

写一个程序。返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。

思路:

设状态dp[i][j] 表示从源串s[0...i] 和 目标串t[0...j] 的最短编辑距离

边界为:dp[i][0] = i,dp[0][j] = j

递推方程:

  1. 假设s[i] == t[j], 那么 dp[i][j] = dp[i-1][j-1]
  2. 假设s[i] != t[j],那么有三种操作情况:

将s[i]删除。dp[i][j] = dp[i-1][j] + 1;

将s中加入t[j],dp[i][j] = dp[i][j-1] +1;

将s和t进行替换,dp[i][j] = dp[i-1][j-1] +1。

因此,能够写出状态转移方程:

dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1))

分别相应:删除、加入、替换(若相等就不替换)

代码:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int Slen = word1.size();
        int Tlen = word2.size();
        int dp[Slen+1][Tlen+1] = {0};//注意:这里都+1,而且初始化为0
        //长度为n的字符串有n+1个隔板
        for(int i=1; i<=Slen; i++)  //注意从1開始
            dp[i][0] = i;
        for(int j=1; j<=Tlen; j++)
            dp[0][j] = j;
        for(int i=1; i<=Slen; i++)
        {
            for(int j=1; j<=Tlen; j++)
            {
                if(word1[i-1] == word2[j-1])
                    dp[i][j] = dp[i-1][j-1];
                else
                {
                    int temp = min(dp[i-1][j], dp[i][j-1]);
                    dp[i][j] = min(temp, dp[i-1][j-1]) + 1;
                }
            }
        }
        return dp[Slen][Tlen];
    }
};
时间: 2024-11-04 11:30:16

行编辑距离Edit Distance——动态规划的相关文章

[Leetcode 72]编辑距离 Edit Distance

[题目] Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2. You have the following 3 operations permitted on a word: Insert a character Delete a character Replace a character Example 1: Input: word1

编辑距离Edit Distance 非常典型的DP类型题目

https://leetcode.com/problems/edit-distance/?tab=Description 真的非常好,也非常典型. https://discuss.leetcode.com/topic/17639/20ms-detailed-explained-c-solutions-o-n-space dp[i][0] = i; dp[0][j] = j; dp[i][j] = dp[i - 1][j - 1], if word1[i - 1] = word2[j - 1];

Edit Distance(动态规划,难)

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a characterb) Delete a characterc) Replace

leetCode 72.Edit Distance (编辑距离) 解题思路和方法

Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a char

[LeetCode] One Edit Distance 一个编辑距离

Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance的拓展,然而这道题并没有那道题难,这道题只让我们判断两个字符串的编辑距离是否为1,那么我们只需分下列三种情况来考虑就行了: 1. 两个字符串的长度之差大于1,那么直接返回False 2. 两个字符串的长度之差等于1,那么长的那个字符串去掉一个字符,剩下的应该和短的字符串相同 3. 两个字符串的长度之

最小编辑距离(Minimum edit distance)

最小编辑距离是计算欧式距离的一种方法,可以被用于计算文本的相似性以及用于文本纠错,因为这个概念是俄罗斯科学家 Vladimir Levenshtein 在1965年提出来的,所以编辑距离又称为Levenshtein距离. 简单的理解就是将一个字符串转换到另一个字符串所需要的代价(cost),付出的代价越少表示两个字符串越相似,编辑距离越小,从一个字符串转换到另一个字符串简单的归纳可以有以下几种操作,1.删除(delete)2.插入(insert)3.修改(update),其中删除和插入的代价可以

Minimum edit distance(levenshtein distance)(最小编辑距离)初探

最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten(k→s) sittin(e→i) sitting(→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. Thewords `computer' and `commuter' are

Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶

sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过bam文件统计比对的indel和mismatch信息 首先要介绍一个非常重要的概念--编辑距离 定义:从字符串a变到字符串b,所需要的最少的操作步骤(插入,删除,更改)为两个字符串之间的编辑距离. 这也是sam文档中对NM这个tag的定义. 编辑距离是对两个字符串相似度的度量(参见文章:Edit Di

leetcode day4 -- Binary Tree Postorder(Preorder) Traversal &amp;&amp; Edit Distance

 1.Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 分析:后续遍历