代码之家  ›  专栏  ›  技术社区  ›  Shaurya Parashar

编辑距离0-索引解决方案失败[关闭]

  •  1
  • Shaurya Parashar  · 技术社区  · 1 年前

    我在cses上实现了一个基于0索引的编辑距离问题解决方案,但它在一个测试用例中给出了错误的答案。

    #include <bits/stdc++.h>
     
    using namespace std;
    # define MOD 1000000007
     
    string s; string t;
     
    int cost(int i,int j){
        return !(s[i] == t[j]);
    }
     
    void solve() {
        // Write your solution here
        cin>>s; cin>>t;
        vector<vector<int>> dp(s.size(),vector<int>(t.size(),0));
        // dp[i][j] -> the minimum edit distance required to equal A[0-i] and B[0-j]
        dp[0][0] = cost(0,0);
        for (int i=1;i<s.size();i++){
            dp[i][0] = dp[i-1][0] + 1;
        }
        for (int j=1;j<t.size();j++){
            dp[0][j] = dp[0][j-1] + 1; 
        }
        for (int i=1;i<s.size();i++){
            for (int j=1;j<t.size();j++){
                dp[i][j] = min({dp[i-1][j-1] + cost(i,j),dp[i-1][j] + 1, dp[i][j-1] + 1});
                //cout<<dp[i][j]<<" ";
            }
        }
     
        cout<<dp[s.size()-1][t.size() -1];
    }   
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
     
        int t=1;
        //cin >> t;
     
        while (t--) {
            solve();
        }
     
        return 0;
    }
    

    由于字符串的最小长度为1。当一个字符串为空时,我不喜欢包含这些情况。 我将基本情况定义如下。 dp[0][0]->编辑通过从字符串1取第一个字符和从字符串2取第一个字符串形成的字符串的距离。当两个字符相等时,这显然是0,当它们不同时,这是1。 现在,对于第一列

    对于(i的大小(字符串1)) dp[i][0]->dp[i-1][0]+1

    由于我不断地从一个字符串中提取更多的字符,而从另一个字符串只提取一个字符,所以我只需要在之前的dp状态中添加一个字符。 第一行也是如此。

    失败的测试用例太大,无法手动检查。

    有人能解释一下哪里出了问题吗?

    1 回复  |  直到 1 年前
        1
  •  4
  •   Gassa    1 年前

    战术错误:动态规划的基础。 通过说 dp[0][0] = cost(0,0) ,你基本上说“第一个操作是更改的前字母 s 的前字母 t ". 还有其他可能的操作:删除的前字母 s 并添加的前字母 t .

    战略错误:问题空间。 思考问题的一个好方法是解决子问题。 一个子问题 (i, j) 具有“我们从左到右顺序执行所有操作,然后我们处理 i 的字母 s j 的字母 t ". 请注意,子问题适用于 0 <= i <= s.size() 0 <= j <= t.size() . 所以,问题空间实际上是 (s.size()+1) (t.size()+1) . 而你的代码两种尺寸都少了一个。

    编辑 一些证明错误的小测试用例是 s="abc", t="bcd" ,反之亦然。实际答案是2(删除前面的 s ,添加回的 t ),但当前代码显示为3。