• 51nod--1183 编辑距离(动态规划)


    题目:

    1183 编辑距离
    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
    例如将kitten一字转成sitting:
    sitten (k->s)
    sittin (e->i)
    sitting (->g)
    所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
    给出两个字符串a,b,求a和b的编辑距离。
    Input
    第1行:字符串a(a的长度 <= 1000)。
    第2行:字符串b(b的长度 <= 1000)。
    Output
    输出a和b的编辑距离
    Input示例
    kitten
    sitting
    Output示例
    3

    分析:

    首先, 对于一个状态 
    Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1;
    对于当前状态, 往任何一个串后添加一个字符, 所需要的操作数 + 1的。(先不讨论相等, 不相等。)
    如果 a[i] == b[j] , Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]);
    两个字符相等是不需要添加任何操作的。
    

    实现:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 1000 + 131;
    
    int Dp[maxn][maxn];
    
    int Solve(const string& a, const string& b) {
        int n = a.length();
        int m = b.length();
        for(int i = 0; i < n; ++i) Dp[i][0] = i;
        for(int i = 0; i < m; ++i) Dp[0][i] = i;
        ///
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j) {
                Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1;
                if(a[i-1] == b[j-1])
                    Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]);
            }
        return Dp[n][m];
    }
    
    int main() {
        string s, t;
        while(cin >> s >> t) {
            cout << Solve(s, t) << endl;
        }
    }
  • 相关阅读:
    命令行界面下用户和组管理之groupadd的使用
    vue数据更新UI不刷新显示解决方案
    传入函数作为string.replace方法的第二个参数应用
    CSS 黑魔法-css控制图标颜色
    谈谈Web Components
    js函数组合
    “平滑滚动”效果骚操作
    BFC布局解析
    关于js构造函数return的一些解惑
    关于setTimeout和setInterval你不知道的事
  • 原文地址:https://www.cnblogs.com/aoxuets/p/5506839.html
Copyright © 2020-2023  润新知