LeetCode -- Edit Distance
2015-10-10 19:05
549 查看
题目描述:
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 character
c) Replace a character
就是求从单词1(word1)变化到单词2(word2)的最小变化次数,每次变化只能:添加、删除或更新1个字符。
本题是一道典型的DP题,递推公式:
假设dp[i,j]表示word1前i-1个字符到word2的前j-1个字符最小变化次数。
首先对dp做初始化,当word1为空串时,dp[i,0]为i(情况只可能是添加i个字符),其中i∈[0,n]。同理,dp[0,i]的初始化也可以看作是word2为空串时,从word1变到空串的情况数同样为i(即只可能是移除i个字符)。
I.当word1[i]与word2[j]相等时,无需更新次数,即dp[i+1,j+1] = dp[i,j]
II.当word1[i]与word2[j]不等时,当前的比较的“上一次比较情况”可以分3种可能:
1. word1[i-1]与word2[j-1]比较
2. word1[i]与word2[j-1]
3. word[i-1]与word2[j]。
只需要从存放这3种情况中比较结果的dp数组中判断哪种情况最小即可。
即,
dp[i+1,j+1]= 最小值(dp[i,j+1], dp[i+1,j], dp[i,j])
实现代码:
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 character
c) Replace a character
就是求从单词1(word1)变化到单词2(word2)的最小变化次数,每次变化只能:添加、删除或更新1个字符。
本题是一道典型的DP题,递推公式:
假设dp[i,j]表示word1前i-1个字符到word2的前j-1个字符最小变化次数。
首先对dp做初始化,当word1为空串时,dp[i,0]为i(情况只可能是添加i个字符),其中i∈[0,n]。同理,dp[0,i]的初始化也可以看作是word2为空串时,从word1变到空串的情况数同样为i(即只可能是移除i个字符)。
I.当word1[i]与word2[j]相等时,无需更新次数,即dp[i+1,j+1] = dp[i,j]
II.当word1[i]与word2[j]不等时,当前的比较的“上一次比较情况”可以分3种可能:
1. word1[i-1]与word2[j-1]比较
2. word1[i]与word2[j-1]
3. word[i-1]与word2[j]。
只需要从存放这3种情况中比较结果的dp数组中判断哪种情况最小即可。
即,
dp[i+1,j+1]= 最小值(dp[i,j+1], dp[i+1,j], dp[i,j])
实现代码:
public class Solution { public int MinDistance(string word1, string word2) { var dp = new int [word1.Length+1, word2.Length+1]; for(var i = 0;i < word1.Length + 1; i++){ dp[i,0] = i; } for(var i = 0;i < word2.Length + 1; i++){ dp[0,i] = i; } for(var i = 0; i < word1.Length; i++){ for(var j = 0;j < word2.Length; j++){ if(word1[i] == word2[j]){ dp[i+1,j+1] = dp[i,j]; } else{ var min = Math.Min(Math.Min(dp[i,j], dp[i,j+1]), dp[i+1,j]); dp[i+1,j+1] = min + 1; } } } return dp[word1.Length, word2.Length]; } }
相关文章推荐
- Android 沉浸模式开发
- LeetCode -- Combination Sum II
- xml约束 Schema
- js2次学习----label语句
- 软件功能测试案例分析
- Linux系统升级gcc/g++
- codeforces 583C GCD Table
- js2次学习-----with语句
- hdu 5036 Explosion(有向图的删点期望+bitset优化)
- linux 常用命令
- ViewModel在MVC3中的应用:实现多字段表格的部分更新
- zoj2112 主席树动态第k大 (主席树&&树状数组)
- DrawText
- centos7 修改默认语言
- 如何查看树莓派cpu温度
- 探讨mvc下linq多表查询使用viewModel的问题
- 客户端Webview重定向
- Android 6.0 新增API 简介(2)
- memset函数用法
- 独立主机如何,不要被人忽悠了