A - String Distance and Transform Process

一道朴素dp题

递推方程 还是比较好推的 路径不好找

路径的方法:
从二维数组最后一个位置往回推,可以通过到达该点的的步数判断从哪个点推过来,
判断完这个步骤以后,dp[i][j]就是a的前i个字母和b的前j个字母匹配成功了,然后4种情况输出路径就好了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 85;

int dp[maxn][maxn];
string a, b;

void path() {
    int lenA = a.length();
    int lenB = b.length();
    int i = lenA;
    int j = lenB;
    int step = dp[lenA][lenB];
    int index = 1;
    while(i > 0 || j > 0) {
        if(i == 0 && j > 0) {
            cout << index << " Insert " << 1 << "," << b[j - 1] << endl;
            index++;
            j--;
        }else if(i > 0 && j == 0) {
            cout << index << " Delete " << i << endl;
            index++;
            i--;
        }else {
            if(step == dp[i - 1][j - 1] && a[i - 1] == b[j - 1]) {
                i--;
                j--;
            }else if(step == dp[i - 1][j - 1] + 1) {
                cout << index << " Replace " << i << "," << b[j - 1] << endl;
                i--;
                j--;
                index++;
                step--;
            }else if(step == dp[i - 1][j] + 1) {
                cout << index << " Delete " << i << endl;
                i--;
                index++;
                step--;
            }else if(step == dp[i][j - 1] + 1) {
                cout << index << " Insert " << i + 1 << "," << b[j - 1] << endl;
                step--;
                j--;
                index++;
            }
        }
    }
}

int main() {
    while(cin >> a >> b) {
        for(int i = 0; i <= a.length(); i++) {
            dp[i][0] = i;
        }
        for(int i = 0; i <= b.length(); i++) {
            dp[0][i] = i;
        }
        for(int i = 1; i <= a.length(); i++) {
            for(int j = 1; j <= b.length(); j++) {
                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + 1;
                if(a[i - 1] == b[j - 1]) {
                    dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
                }else {
                    dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);
                }
            }
        }
        cout << dp[a.length()][b.length()] << endl;
        path();
    }
    return 0;
}*/

猜你喜欢

转载自blog.csdn.net/qq_44833767/article/details/107419756
今日推荐