码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode72 Edit Distance

时间:2016-09-23 23:27:58      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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: (Hard)

a) Insert a character
b) Delete a character
c) Replace a character

分析:

双序列动态规划问题,dp[i][j]表示第一个序列i ...和 第二个序列j ...;

对应本题:

1. 状态: dp[i][j]表示第一个字符串前i个字符到第二个字符串前j个字符需要的编辑距离;
2. 递推关系:
  如果 s1[i] == s2[j]
    dp[i][j] = min(dp[i-1][j-1] //表示修改
           ,dp[i-1][j] + 1 //表示删除
             ,dp[i][j-1] + 1) //表示增加
  如果 s1[i] != s2[j]
    dp[i][j] = min(dp[i-1][j-1] ,dp[i-1][j],dp[i][j-1]) + 1

3. 初始化:

  dp[i][0] = i; i = 1...m;
  dp[0][j] = j; j = 1...n;

代码:

 1 class Solution {
 2 public:
 3     int minDistance(string word1, string word2) {
 4         //dp[i][j]表示第一个字符串前i个字符到第二个字符串前j个字符需要的编辑距离;
 5         int m = word1.size(), n = word2.size() ;
 6         int length = max(m,n);
 7         int dp[length + 1][length + 1];
 8         dp[0][0] = 0;
 9         for(int i = 1;i <= m;++i){
10             dp[i][0] = i;    
11         }
12         for(int i = 1; i <= n;++i){
13             dp[0][i] = i;
14         }
15         for(int i = 1; i <= m; ++i){
16             for(int j = 1; j <= n; ++j){
17                 if(word1[i - 1] != word2[j - 1]){
18                     dp[i][j] = min( min(dp[i-1][j-1],dp[i-1][j]), dp[i][j-1]) + 1;
19                 }
20                 else{
21                     dp[i][j] = min( min(dp[i-1][j-1], dp[i-1][j] + 1), dp[i][j-1] + 1);
22                 }
23             }
24         }
25         return dp[m][n];    
26     }
27 };

 

 

 

LeetCode72 Edit Distance

标签:

原文地址:http://www.cnblogs.com/wangxiaobao/p/5901877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!