leetcode Edit Distanc (DP)
来源:互联网 发布:学淘宝推广 编辑:程序博客网 时间:2024/05/29 08:04
Edit Distance Total Accepted: 5097 Total Submissions: 20793 My Submissions
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
class Solution {
public:
int minDistance(string word1, string word2) {
if (word1.size() == 0 && word2.size() == 0) return 0;
if (word1.size() == 0) return word2.size();
if (word2.size() == 0) return word1.size();
vector<vector<int> > d;
d.resize(word1.size());
for (int i = 0; i < d.size(); ++i) {
d[i].resize(word2.size(), 0);
}
if (word1[0] == word2[0])
d[0][0] = 0;
else
d[0][0] = 1;
for (int i = 1; i < word1.size(); ++i) {
if (word1[i] == word2[0])
d[i][0] = i;
else
d[i][0] = d[i-1][0] + 1;
}
for (int i = 1; i < word2.size(); ++i) {
if (word2[i] == word1[0])
d[0][i] = i;
else
d[0][i] = d[0][i-1] + 1;
}
for (int i = 1; i < word1.size(); ++i) {
for (int j = 1; j < word2.size(); ++j) {
if (word1[i] == word2[j]) {
d[i][j] = d[i-1][j-1];
} else {
d[i][j] = min(d[i-1][j], d[i][j-1]);
d[i][j] = min(d[i][j], d[i-1][j-1]);
d[i][j] += 1;
}
}
}
return d[word1.size()-1][word2.size()-1];
}
};
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
第一个自己做出来的DP题啊!
注意到增和删其实是一样的效果,增加A里面的一个字符,就等于把B里面多的那个字符删掉。所以就是比较删A还是删B,就是d[i][j] = min(d[i-1][j], d[i][j-1]
然后再加上这次的增或删操作就是+1.
// 第一次做把这种情况给漏了
然后还有以一种就是当前位置A[i]和B[i]的字符做替换,这种就是说看看A[i-1], B[i-1]是否相等了,相等就是做替换最小。 就是d[i][j] = min(上面两个, d[i-1][j-1])
然后在加上这次的替换操作就是+1.
因此 d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;
因此状态转移方程为:
if (word1[i] == word2[j]) {
d[i][j] = d[i-1][j-1];
} else {
d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;
}
注意初始化。
所以这道题没写出状态方程之前,就可以大概感觉到,实际上是2D/0D的问题,因为比较明显只依赖于O(n^0)的子问题来推导当前子问题,一共有O(n^2)个子问题。然后就可以从d[0][0]开始手算,来验证想法。确实是依赖于O(1)的子问题的。
class Solution {
public:
int minDistance(string word1, string word2) {
if (word1.size() == 0 && word2.size() == 0) return 0;
if (word1.size() == 0) return word2.size();
if (word2.size() == 0) return word1.size();
vector<vector<int> > d;
d.resize(word1.size());
for (int i = 0; i < d.size(); ++i) {
d[i].resize(word2.size(), 0);
}
if (word1[0] == word2[0])
d[0][0] = 0;
else
d[0][0] = 1;
for (int i = 1; i < word1.size(); ++i) {
if (word1[i] == word2[0])
d[i][0] = i;
else
d[i][0] = d[i-1][0] + 1;
}
for (int i = 1; i < word2.size(); ++i) {
if (word2[i] == word1[0])
d[0][i] = i;
else
d[0][i] = d[0][i-1] + 1;
}
for (int i = 1; i < word1.size(); ++i) {
for (int j = 1; j < word2.size(); ++j) {
if (word1[i] == word2[j]) {
d[i][j] = d[i-1][j-1];
} else {
d[i][j] = min(d[i-1][j], d[i][j-1]);
d[i][j] = min(d[i][j], d[i-1][j-1]);
d[i][j] += 1;
}
}
}
return d[word1.size()-1][word2.size()-1];
}
};
1 0
- leetcode Edit Distanc (DP)
- Leetcode dp Edit Distance
- [leetcode][DP] Edit Distance
- LeetCode Edit Distance DP
- [LeetCode] Edit Distance(!!!!!DP)
- leetcode---edit-distance---dp
- Leetcode-Edit Distance(dp)
- leetcode -- Edit Distance -- 重点dp
- leetcode 72. Edit Distance DP
- [LeetCode] DP 之 Edit Distance
- Leetcode 72 Edit Distance DP好题
- Leetcode 72 - Edit Distance(dp)
- leetcode 72 Edit Distance(DP)
- LeetCode 72 Edit Distance DP解法思路记录
- [LeetCode 72] Edit Distance(编辑距离/动态规划/DP)
- leetcode 72. Edit Distance DP动态规划 + 编辑距离
- LeetCode-72-Edit Distance 记忆化搜索DP
- 4.Edit Distance【dp】
- MySQL基础知识---------ANALYZE TABLE语法/SHOW CREATE TABLE语法
- eclipse运行android程序,总是启动一个新的AVD模拟器,解决办法
- 黑马程序员学习笔记——Runtime类
- 小米手机-米1 wifi密码输入正确但还是被提示密码错误
- technical knowledge
- leetcode Edit Distanc (DP)
- Oracle10g数据文件的收缩与数据对象跨表空间的迁移
- 关于HTML5、Jquery、Phonegap跨域问题的研究
- 没有阿里,新浪微博还能盈利么?
- 如何获取iPhone屏幕的亮度
- WdatePicker 没有权限
- 哈票网(www.hipiao.com)密码找回bug
- Android Camera API 与 OpenCV API
- Android电话拨打流程源码分析