LeetCode 72 Edit Distance

我写了两种方案的。一种是用的递归方式,结果超时了。一种是直接用数组模拟删、替换、插入操作。删操作对应的是DP[i][j-1],替换操作对应的是DP[i-1][j-1],插入操作对应额的是DP[i-1][j].此外要注意初始化的情形,如果word1是0,那么对应的最小步骤是word2的长度;如果word2是0,那么对应的最小步骤是word1的长度。OK。
解法一:超时的那种。。。。
class Solution {
public:
    int minDistance(string word1, string word2) {
       int ptr1,ptr2;
       int a1,a2,a3;
       ptr1 = ptr2 = 0;
       int res1,res2;
       res1=res2=0;
       a1 = a2 = a3 = 0x9999;
       if(word1.empty()&&word2.empty())return 0;
           while((ptr1<word1.size()) && (ptr2<word2.size()) && (word1[ptr1]==word2[ptr2]))
           {
            res1++;
            res2++;
            ptr1++;
            ptr2++;
           }
       if(ptr1==word1.size()&&ptr2==word2.size())return 0;
          // cout<<ptr1<<" "<<ptr2<<endl;
           //Del
          if(ptr2!=word2.size())
          {  
             //cout<<ptr1<<" "<<ptr2<<endl;
             a1 = minDistance(word1.substr(ptr1,word1.size()-res1),word2.substr(ptr2+1,word2.size()-res2-1))+1;
          }
         // cout<<a1<<endl;
           //rep
          if(word1.size()&&ptr2!=word2.size())          
          {  
             //cout<<ptr1<<" "<<ptr2<<endl; 
             a2 = minDistance(word1.substr((ptr1<word1.size()?ptr1+1:ptr1),word1.size()-res1-1),word2.substr(ptr2+1,word2.size()-res2-1))+1;
          }
        //  cout<<a2<<endl;
           //ins
           // cout<<res1<<" "<<res2<<endl;
           // cout<<ptr1<<" "<<ptr2<<endl;
            // cout<<(word1.substr(ptr1,word1.size()-res1-1)).size()<<endl;
          if(word1.size())
             a3 = minDistance(word1.substr((ptr1<word1.size()?ptr1+1:ptr1),word1.size()-res1-1),word2.substr(ptr2,word2.size()-res2))+1;
  //  cout<<a1<<" "<<a2<<" "<<a3<<endl;
    return Min3(a1,a2,a3);
    }
private:
   int Min3(int a,int b,int c)
   {
       if(a<=b&&a<=c)return a;
       else if(b<=a&&b<=c)return b;
       return c;
   }
};
解法二:(注意哈,C++ 自带的min、max可以是多个参数,自己可以不用写)
class Solution {
public:
    int minDistance(string word1, string word2) {
    if(word1.size()==0)return word2.size();
    if(word2.size()==0)return word1.size();
    int len1=word1.size(),len2=word2.size();
    int **dp = new int*[len1+1];
    for(int i=0;i<=len1;i++)
    dp[i] = new int[len2+1];
    for(int i =0 ;i<=len1;i++)
    dp[i][0] = i;
    for(int j = 0;j<=len2;j++)
    dp[0][j] = j;
    for(int i =1 ;i<=len1;i++)
     for(int j =1;j<=len2;j++)
      if(word1[i-1]==word2[j-1])dp[i][j]=dp[i-1][j-1];
      else 
      {
          dp[i][j] = Min3(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1;
      }
    return dp[len1][len2];
    }
private:
   int Min3(int a,int b,int c)
   {
       if(a<=b&&a<=c)return a;
       else if(b<=a&&b<=c)return b;
       return c;
   }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值