dp注意问题

  递推式

  初值

  空间优化

1. bfs

题目里有“最小”字样,符合bfs关键词:上界len(S)+len(T)

实际上不可行;

2. dp

删除字符很麻烦

换个角度,变为字符串“对齐问题”:

S = ABCF

T = DBFG

S:A B C F -

T:D B - F G

对应位置相同则不扣分,不同则扣一分(需要修改一次)

两个特殊字符“-”不会对应

S位置“-”代表增字符

T位置“-”代表删字符

使扣分最少

dp[i][j]表示S的前i个位置和T的前j个位置对齐的最少得分

dp[i][j] = min(dp[i-1][j-1]+same(i,j), dp[i-1][j]+1, dp[i][j-1]+1)

  dp[i-1][j-1]+same(i,j)对应S第i个字符和T的第j个字符对齐

  dp[i-1][j]+1对应S第i个字符和“-”对齐,即删掉S中第i个字符

  dp[i][j-1]+1对应T第j个字符和“-”对齐,即在S中加入该字符

初值

  dp[0][j] = j, j>=0

  dp[i][0] = i, i>=0

时间复杂度:O(len(S)*len(T))

空间优化:省掉一维

  对每个i,正向循环j 

    注意保存dp[i-1][j-1],因为j-1已经是新值

 1 class Solution {
 2 public:
 3     /**
 4      * @param word1 & word2: Two string.
 5      * @return: The minimum number of steps.
 6      */
 7     int minDistance(string word1, string word2) {
 8         // write your code here
 9         int m = word1.length(), n = word2.length();
10         vector<vector<int> > dp(m + 1, vector<int>(n + 1));
11         for (int i = 0; i <= m; ++i) {
12             for (int j = 0; j <= n; ++j) {
13                 if ( i== 0 ) {
14                     dp[i][j] = j;
15                 } else if (j == 0) {
16                     dp[i][j] = i;
17                 } else {
18                     dp[i][j] = min(dp[i - 1][j - 1] + ((word1[i - 1] == word2[j - 1])?0:1),
19                                    min(dp[i][j - 1] + 1, dp[i - 1][j] + 1)
20                                 );
21                 }
22             }
23         }
24         return dp[m][n];
25     }
26 };

空间优化

 1 class Solution {
 2 public:
 3     /**
 4      * @param word1 & word2: Two string.
 5      * @return: The minimum number of steps.
 6      */
 7     int minDistance(string word1, string word2) {
 8         // write your code here
 9         int m = word1.length(), n = word2.length();
10         // vector<vector<int> > dp(m + 1, vector<int>(n + 1));
11         vector<int> dp(n + 1);
12         for (int i = 0; i <= m; ++i) {
13             int last;
14             for (int j = 0; j <= n; ++j) {
15                 if ( i== 0 ) {
16                     dp[j] = j;
17                 } else if (j == 0) {
18                     last = dp[j];
19                     dp[j] = i;
20                 } else {
21                     int tmp = dp[j];
22                     dp[j] = min(last + ((word1[i - 1] == word2[j - 1])?0:1),
23                                    min(dp[j - 1] + 1, dp[j] + 1)
24                                 );
25                     last = tmp;
26                 }
27             }
28         }
29         return dp[n];
30     }
31 };

LintCode: Edit Distance相关推荐

  1. 字符串编辑距离(Edit Distance)

    一.问题描述 定义 字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符 ...

  2. leetcode Edit Distance

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051082.html 题目链接:leetcode Edit Distance 最短编辑距离, ...

  3. 详解编辑距离(Edit Distance)及其代码实现

    概述 编辑距离(Minimum Edit Distance,MED),由俄罗斯科学家 Vladimir Levenshtein 在1965年提出,也因此而得名 Levenshtein Distance ...

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

    sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...

  5. Edit Distance Python源码及支持包的实现

    Edit Distance Python源码及支持包的实现 编辑距离 编辑距离 又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance)指两个字串之间,由一个转成另一个所需的最少 ...

  6. [leetcode]Edit Distance

    先给一个例子,两个字符串eeba和abca相似度是多少呢,edit distance是一个很好的度量,定义从字符串a变到字符串b,所需要的最少的操作步骤(插入,删除,更改)为两个字符串之间的编辑距离. ...

  7. 中石油训练赛 - Edit Distance(思维+构造)

    题目描述 A binary string is a non-empty sequence of 0's and 1's, e.g., 010110, 1, 11101, etc. The edit d ...

  8. mysql 编辑距离 搜索_最小编辑距离(Minimum Edit Distance)

    最小编辑距离 1)定义 编辑距离(Minimum Edit Distance,MED),又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需要的最少编辑操作次数.允许的编辑操作包括 ...

  9. python 编辑距离_python实现编辑距离edit distance

    1.定义理解 edit distance--指两个字符串之间,一个转为另一个的最小编辑次数(方式有:插入/删除/替换) 若edit distance越小,则字符串之间的相似度越高. 例1: 输入: w ...

最新文章

  1. 21条高效时间管理法则
  2. python 元组 字典 列表 序列化与反序列化
  3. MySQL解决root用户密码丢失问题
  4. Docker 图形界面管理工具 -- Portainer
  5. 嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中
  6. LINUX编译mate-desktop/pluma-1.26.0文本编辑器
  7. pyqt5 显示更新进度条_python如何通过pyqt5实现进度条
  8. 谭浩强C语言(第三版)习题5.7
  9. python3的字符串操作
  10. 毕业论文答辩技巧及注意事项(附答辩自述模板)~
  11. NVIDIA显卡如何显示fps?
  12. ThreadPoolExecutor线程池终止
  13. java ssl 双向认证_java实现 SSL双向认证
  14. 设置字根,配合rem适配(多尺寸屏幕的适配)
  15. 通过className属性给一个元素追加新class(addClass函数)
  16. 用卷积神经网络(CNN)识别文字
  17. 使用VMware安装Ubuntu虚拟机 - 完整教程
  18. 调用iframe子页面中的函数
  19. 服务器文件上传500报错,500 InternalServerError
  20. 大型电商网站架构分析

热门文章

  1. 给初恋女孩的信....
  2. 好程序员web前端分享HTML基础篇
  3. SDWebImage中文说明
  4. mybatis的缓存简说
  5. JavaScript基础教程(三)
  6. ubuntu 16 下安装 Ubuntu Make
  7. linux下怎么修改mysql的字符集编码
  8. DFS Codeforces Round #299 (Div. 2) B. Tavas and SaDDas
  9. 如何在Linux上从命令行嗅探HTTP流量
  10. ASP.NET Atlas学习团队建议收集