编辑距离

leetcode72.编辑距离

别说谁变了你拦得住时间么 提交于 2020-04-07 01:36:30
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示例 2: 输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') 思路:动态规划(自底向上) dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数 所以, 当 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1]; 当 word1[i] != word2[j],dp[i][j] =

[ Leetcode ] No.72 编辑距离

こ雲淡風輕ζ 提交于 2020-04-06 12:18:25
题目: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 题解: class Solution { public: int minDistance(string word1, string word2) { /**f[i][j]表示word1中的第i个单词,与word2中的第j个单词所需的编辑距离 1. 如果word1[i] == word2[j],则两者相等,i--; j--; 2. 如果不相等 1)若是插入字符,word1[i]与word2[j-1],即f[i][j-1] + 1。 2)若是删除字符,word1[i-1],与word2[j],即f[i-1][j] + 1。 3)替换,也是同时f[i-1][j-1] + 1 3. 比较三种操作,取最小值。 **/ int n = word1.size(), m = word2.size(); vector<vector<int>> f(n+1, vector<int>(m+1, 0)); for(int i = 0; i <= n; i++) { // 当word1到第i位,但word2已经结束时 f[i][0] = i; } for(int j = 0; j <= m; j++) { f[0

最短编辑距离 72.EditDistance.md

旧街凉风 提交于 2020-03-31 21:21:58
题目描述 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 = "horse", word2 = "ros"Output: 3Explanation: horse -> rorse (replace 'h' with 'r')rorse -> rose (remove 'r')rose -> ros (remove 'e') Example 2: Input: word1 = "intention", word2 = "execution"Output: 5Explanation: intention -> inention (remove 't')inention -> enention (replace 'i' with 'e')enention -> exention (replace 'n' with 'x')exention ->

编辑距离

最后都变了- 提交于 2020-03-09 08:20:15
描述 设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种: 1、删除一个字符; 2、插入一个字符; 3、将一个字符改为另一个字符。 对任意的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。 格式 输入格式 第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。 输出格式 只有一个正整数,为最少字符操作次数。 样例 输入样例 sfdqxbw gfdgw 输出样例 4 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 3001 #define MOD 2520 #define E 1e-12 using namespace std; char a[N],b[N]; int f[N][N]; int main() { scanf("%s%s",a+1,b+1); int n=strlen(a+1); int m=strlen(b

编辑距离

不羁岁月 提交于 2020-03-02 00:06:28
定义 编辑距离又称Leveinshtein距离,是由俄罗斯科学家Vladimir Levenshtein在1965年提出。编辑距离是计算两个文本相似度的算法之一,以字符串为例,字符串a和字符串b的编辑距离是将a转换成b的最小操作次数,这里的操作包括三种: 插入一个字符 删除一个字符 替换一个字符 举个例子,kitten和sitting的编辑距离是3,kitten -> sitten(k替换为s) -> sittin(e替换为i) -> sitting(插入g),至少要做3次操作。 力扣原题 题解 思路: dp[i][j]用来表示主串前i个字符(包括i),匹配到前j个字符时所需要的最小编辑距离,如果字符一样,那就等于dp[i-1][j-1],如果不一样,那就比较三种情况,比如删除,那就dp[i-1][j]+1,插入,那就dp[i][j-1]+1,替换那就dp[i-1][j-1]+1 注意: 三种操作都是对主串进行的 要从1开始遍历,不然在条件判断语句就会越界 要以主串为行,模板串为列 要初始化 class Solution { public : int minDistance ( string word1 , string word2 ) { int i , j , k , m , n , x , y , q , u ; int len1 = word1 . length ( ) ;

编辑距离 五种解法

百般思念 提交于 2020-03-01 08:41:32
72. 编辑距离 【困难题】【动态规划】 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符,删除一个字符,替换一个字符 输入 : word1 = "horse" , word2 = "ros" 输出 : 3 解释 : horse - > rorse ( 将 'h' 替换为 'r' ) rorse - > rose ( 删除 'r' ) rose - > ros ( 删除 'e' ) 输入 : word1 = "intention" , word2 = "execution" 输出 : 5 解释 : intention - > inention ( 删除 't' ) inention - > enention ( 将 'i' 替换为 'e' ) enention - > exention ( 将 'n' 替换为 'x' ) exention - > exection ( 将 'n' 替换为 'c' ) exection - > execution ( 插入 'u' ) 题目讲解 解法1:非递归一 【核心思想】 动态规划 【思路】 令 dp[i][j] 为:当遍历到字符串 word1 的第 i 个字符,遍历到字符串 word2 的第 j 个字符时,转换所需要的最少操作次数为 dp

leetcode 72.编辑距离

早过忘川 提交于 2020-02-20 18:36:29
题目描述 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入: word1 = “horse”, word2 = “ros” 输出: 3 解释: horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’) 示例2: 输入: word1 = “intention”, word2 = “execution” 输出: 5 解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’) 动态规划 思路: dp[i][j]表示word1的前i个字符到word2到前j个字符的编辑距离 若word1[I] == word2[j] 则dp[I][j] = dp[i-1][j-1] 若word1[I] != word2[j] 则dp[I][j] =1+ min( dp[i-1]

动态规划:字符串编辑距离

亡梦爱人 提交于 2020-02-14 17:52:57
动态规划:字符串编辑距离 问题描述 有两个字符串A和B,现在将A经过三种变换可以得到B,即插入、删除和修改,这三种操作的代价分别为c0,c1和c2,问题就是A到B的变换所需要的最小代价是多少。 思路 典型的动态规划问题,娇哥曾经说过,字符串的问题大部分都是动态规划的问题,那么这个问题要怎么解决呢?动态规划问题首先定义状态,然后定义状态转移方程,然后确定初始状态和终止状态,然后就可以得到终止状态下的结果输出。 定义状态 我们定义状态 dp[i][j] 表示A从0-i和B从0-j这两段的最小编辑距离。状态的定义需要注意的是,状态只能和前面的情况有联系不能和后面的情况有联系。 转移方程 有了状态,那么就定义状态转移方程,状态转移方程的定义有时候会需要“找规律”,但是这道题的规律比较明显,很容易知道,当 A[i] == B[j] 的时候,从 dp[i-1][j-1] 到 dp[i][j] 是不需要任何编辑的,所以 dp[i-1][j-1] = dp[i][j] ,但是当他们不相等的时候,就需要考虑是插入、删除还是编辑的代价最短了,那么自然而然地有三种情况:插入,删除和编辑。插入的情况是什么? 插入是A在和B的前j-1个比,然后再在A的基础上进行插入一个字符,插入的字符是B的第j位,所以插入的代价是 dp[i][j-1]+c0 删除是A的前i-1个和B的j个比,因为把A删除了一个字符

1183 编辑距离

时光怂恿深爱的人放手 提交于 2020-02-08 23:11:18
1183 编辑距离 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。 给出两个字符串a,b,求a和b的编辑距离。 收起 输入 第1行:字符串a(a的长度 <= 1000)。 第2行:字符串b(b的长度 <= 1000)。 输出 输出a和b的编辑距离 输入样例 kitten sitting 输出样例 3 思路 : 一个字符串 a 转移成另一个字符串 b 需要进行的最小次数 , 一共三中操作 , 修改,删除,添加 。删除和添加都改变了字符串的长度。转移函数 dp[i][j] 表示的是a串的i位置和b串的j位置的编辑距离。 转移方程 : 如果当前 , 则 dp[i][j] = dp[i-1][j-1] ,即什么也不干。否则, dp[i ][j] = min(修改,删除,插入) ; 即 , dp [i][j] = min (dp[i-1][j-1+1 , min(dp[i-1]

洛谷P2758编辑距离(线性DP)

自古美人都是妖i 提交于 2020-02-07 16:14:44
题目描述 设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种: 1、删除一个字符; 2、插入一个字符; 3、将一个字符改为另一个字符; !皆为小写字母! 输入格式 第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。 输出格式 只有一个正整数,为最少字符操作次数。 输入输出样例 输入 #1 sfdqxbw gfdgw 输出 #1 4令dp[i][j]代表的含义为将a串的前i个字符转化为b串的前j个字符所需要的最少操作次数。在写转移方程的时候考虑这么几种情况:1.a[i-1]==b[j-1](a[i-1]为a的第i个字符:则dp[i][j]=dp[i-1][j-1]相等时无需进行操作。2.a[i-1]!=b[j-1]:dp[i][j]=min(dp[i-1][j-1]+1,dp[i][j-1]+1,dp[i-1][j]+1) 含义分别为替换,插入和删除。替换比较好理解,直接在dp[i-1][j-1]基础上加上替换的一步操作即可。插入因为是在a[i]插入了一个与b[j]相同的字符,所以这里认为a串第i个之前与b串第j-1个之前的字符经过dp[i][j-1]次操作匹配了,只需要再增加一次添加操作。对a的插入可以看作与对b的删除互为逆运算,类比一下可理解。可以联想一下stud转换为study,求dp[4][5]