侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

LeetCode 161. 相隔为 1 的编辑距离

Hope
2022-03-04 / 0 评论 / 0 点赞 / 351 阅读 / 1,305 字
温馨提示:
本文最后更新于 2022-03-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

LeetCode 161. 相隔为 1 的编辑距离

思路:

Dp O(n^2)

f[i][j]表示为如何对s的 1~i 修改可以匹配 t的1~j
三种情况:
删除 f[i - 1][j] + 1 删除a[i]
添加 f[i][j-1] + 1 添加 b[j]
修改 if(s[i] == t[j]) f[i - 1][j - 1] else f[i - 1][j - 1] + 1 修改s[i]

遍历枚举 O(n)

代码:
Dp

class Solution {
public:
    //如何对s的 1~i 修改可以匹配 t的1~j
    //删除 f[i - 1][j] + 1 删除a[i]
    //添加 f[i][j-1] + 1    添加 b[j]
    //修改 if(s[i] == t[j]) f[i - 1][j - 1] else f[i - 1][j - 1] + 1 修改s[i]
    vector<vector<int>> f;
    bool isOneEditDistance(string s, string t) {
        int n = s.size();
        int m = t.size();
        if(abs(n - m) > 1) return false;
        if(n==m)
        {
            int cnt=0;
            for(int i=0;i<n;i++)cnt+=(s[i]==t[i]);
            return cnt==n-1;
        }

        f = vector<vector<int>> (n + 1,vector<int> (m + 1));
        s = ' ' + s;
        t = ' ' + t;
        //Dp
        for(int i = 1;i <= n;i++) f[i][0] = i;
        for(int i = 1;i <= m;i++) f[0][i] = i;

        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= m;j++){
                f[i][j] = min(f[i-1][j],f[i][j-1]) + 1;
                if(s[i] == t[j]) f[i][j] = min(f[i][j] , f[i - 1][j - 1]);
                else f[i][j] = min(f[i][j],f[i - 1][j - 1] + 1);
            }
        }
        return f[n][m] == 1;
    }
};

枚举

class Solution {
public:
    bool isOneEditDistance(string s, string t) {
        //讨论几种情况 可以是O(n)的
        //Dp是O(n^2)的
        int n = s.size();
        int m = t.size();
        if(abs(n - m) > 1) return false;
        if(n == m){
            int cnt = 0;
            for(int i = 0;i < n;i++) if(s[i] != t[i]) cnt++;
            return cnt == 1;
        }
        //剩下的就是长度不同但是长度相差1
        return IsSameSubOne(s,t);
    }
    //s是长的
    bool IsSameSubOne(string &s,string &t){
        if(s.size() < t.size()) return IsSameSubOne(t,s);
        int cnt = 0;
        for(int i = 0,j = 0;i < s.size();){
            if(s[i] == t[j]) cnt++,i++,j++;
            else i++; 
        }
        return cnt == t.size();
    }
};
0

评论区