51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183

编辑距离,又称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的编辑距离

Sample Input

kitten
sitting

Sample Output

3

题解:

定义dp[i][j]为把字符串a[0:i-1]改变到字符串b[0:j-1]所需的最少步数(即a[0:i-1]到b[0:j-1]的编辑距离);

状态转移方程直接看代码即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int MAX=(int)(1e3+5);

char a[MAX],b[MAX];
int lena,lenb;
int dp[MAX][MAX];
// if(a[i]==b[j]) dp[i][j] = min( dp[i][j-1]+1 , dp[i-1][j]+1 , dp[i-1][j-1] );
// if(a[i]!=b[j]) dp[i][j] = min( dp[i][j-1]+1 , dp[i-1][j]+1 , dp[i-1][j-1]+1);

int MIN(int a,int b,int c){return min(a,min(b,c));}

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    scanf("%s%s",a,b);
    lena=strlen(a);
    lenb=strlen(b);

    //初始化
    for(int i=0;i<=lena;i++) dp[i][0]=i;
    for(int j=0;j<=lenb;j++) dp[0][j]=j;

    //状态转移
    for(int i=1;i<=lena;i++)
    {
        for(int j=1;j<=lenb;j++)
        {
            dp[i][j] = MIN(dp[i][j-1]+1, dp[i-1][j]+1, dp[i-1][j-1]+(a[i-1]!=b[j-1]));
        }
    }

    printf("%d\n",dp[lena][lenb]);
}

原文地址:https://www.cnblogs.com/dilthey/p/8638252.html

时间: 2024-11-09 05:04:36

51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]的相关文章

P2758 编辑距离 简单DP

Description 要把两个字符串变成相同的字符串 一共可以利用以下三种操作: 1.把串中任意一个字符删去: 2.在串中任意一个位置插入一个字符: 3.把串中任意一个字符变成其他任意字符: 问至少要多少次操作才能让两个字符串相同? (https://www.luogu.com.cn/problem/P2758) Solution 状态:设\(F[i][j]\)为把\(s1[0]-s1[i - 1]\)变为\(s2[0]-s2[j - 1]\)所需要的步数. 对于\(f[i][j]\)若相等,

51nod 1183 编辑距离(dp)

题目链接:51nod 1183 编辑距离 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 1001; 6 char a[N], b[N]; 7 int dp[N][N];//dp[i][j]:a串的前i个字符转化成b串的前j个字符的最少操作数 8 int main(){ 9 int i, j; 10 scanf(&quo

(DP)51NOD 1183 编辑距离

编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以kitten和sitting的编辑距离是3.俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 给出两个字符串a,b,求

51nod 1183 编辑距离

1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k->s) sittin (e->i) sitting (->g) 所以kitten和sitting的编辑

hdu 4323 Magic Number (dp,编辑距离)

链接:hdu 4323 题意:给定n个串和m次询问,对于每次询问,给定一个字符串t,和最大操作次数a, 问在n个字符串中有多少个能在规定的次数之内变成字符串t. 说明:字符串的基本操作仅为:删除.插入和修改一个字符这三种操作 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 两个字符串的编辑距离:两个字符串a和b,通过上述的基本操作,把a变成b或b变成a, 需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离 分析:分别求出n个字符串与字符串t之间的编辑距离,并判断是

字符串编辑距离(Levenshtein距离)算法

基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改.插入.删除)所需要的最少次数.俄罗斯科学家Vladimir Levenshtein于1965年提出了这一概念. 简单例子 从字符串“kitten”修改为字符串“sitting”只需3次单字符编辑操作,如下: sitten ( k -> s ) sittin ( e -> i ) s

动态规划 51nod 1183

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 1183 编辑距离  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成s

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter 题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数. dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j个汉诺塔移到一根上dp[ n - j ],然后就是普通的汉诺塔问题,即2^n - 1次移动, 然后把剩下的移动过去dp [ n - j ]. 注意pow(2, j )可能超出long long int范围.写二的次方的时候也可用移位算法. #include <iostream