2018.8.17 题解 2018暑假集训之编辑距离

应该是一个很经典的题目了吧

上题面描述



概念

字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:

  • 删除一个字符     a) Insert a character
  • 插入一个字符     b) Delete a character
  • 修改一个字符     c) Replace a character

例如对于字符串"if"和"iff",可以通过插入一个‘f‘或者删除一个‘f‘来达到目的。

一般来说,两个字符串的编辑距离越小,则它们越相似。如果两个字符串相等,则它们的编辑距离(为了方便,本文后续出现的“距离”,如果没有特别说明,则默认为“编辑距离”)为0(不需要任何操作)。不难分析出,两个字符串的编辑距离肯定不超过它们的最大长度(可以通过先把短串的每一位都修改成长串对应位置的字符,然后插入长串中的剩下字符)。

问题描述

给定两个字符串A和B,求字符串A至少经过多少步字符操作变成字符串B。 



对于这个问题来讲我们首先想到的是用bfs解决

然而发现会TLE Q_Q

对于求最值的问题,我们考虑搜索、dp、贪心

已经排除搜索(同样易证得贪心不可行)于是考虑用dp解决



本题有一个很类似的问题 题目传送门 同样是对两个字符串上的dp

同样的在前面我们讲过一个纸牌问题解决如何“两个同时取”

而这个题只有两个变量 就是两个串取到了第几个位置

综上所述

我们分两种情况考虑

(1)a[i]==b[j] dp[i][j]=dp[i-1][j-1](该字符不变)

(2)a[i]!=b[j] dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1(更改、插入、删除)

上代码吧


#include<iostream>
#include<cstring>
using namespace std;
int dp[3050][3050],lena,lenb,a[3050],b[3050];
int main()
{
    gets(a+1),gets(b+1);
    lena=strlen(a+1),lenb=strlen(b+1);
    for(int i=1;i<=lena;i++)dp[i][0]=i;
    for(int j=1;j<=lenb;j++)dp[0][i]=i;
    for(int i=1;i<=lena;i++)
    {
        for(int j=1;j<=lenb;j++)
        {
            if(a[i]==b[j])dp[i][j]=dp[i-1][j-1];
            else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]+1));
        }
    }
    printf("%d",dp[lena][lenb]);
    return 0;
}

也是一个经典的字符串dp题目

原文地址:https://www.cnblogs.com/qxds/p/9495442.html

时间: 2024-08-30 11:57:23

2018.8.17 题解 2018暑假集训之编辑距离的相关文章

暑假集训之专题----拓扑排序题解

第一单: Problem A Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 26   Accepted Submission(s) : 5 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so h

暑假集训练习赛题解

比赛链接:http://acm.nyist.net/JudgeOnline/problemset.php?cid=205 对于第一道题 UFS(Union  Find  Set) ,请参见http://blog.csdn.net/u011632342/article/details/37814289,题目大意一样,解法一样,不过后台测试数据还没整太多,数据比较弱... 对于第二道题STR(STRing),本来是想着给大家"送福利"呢,可能由于我的题目表述能力不太好或者样例数据的特殊性或

Intel Digital Innovation Industry Summit(2018.08.17)

时间:2018.08.17地点:北京金隅喜来登大酒店 原文地址:https://www.cnblogs.com/xuefeng1982/p/10331638.html

暑假集训(2)第五弹 ----- Who&#39;s in the Middle(poj2388)

G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description FJ is surveying his herd to find the most average cow. He wants to know how much milk this 'median

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr

2017暑假集训——所见,所闻,所想,所悟

很久了,就想写个总结,想想过去的一年都做了什么,以后又该做什么,所以说,这与其说是这次暑假集训的总结不如说是来一年的总结吧: 一年了已经,时间还真是毫不留情啊,从小萌新成了老油子,刚军训完的时候还是个瘦子,结果现在成了一个小胖子,真是好难受,心好痛,所以打算大二减减肥,哈哈,这一年来,遇到了很多人,也明白了很多事,成长了许多,一直在做自己喜欢的事,但是还没有竭尽全力,如今知我所求,当竭尽全力才是,重要的还是两个字,自律.跳出生活的舒适区,敢于改变,学会自律,方才会有成长吧: 对于刚刚经历的暑假集

CSU-ACM暑假集训基础组训练赛(4)解题报告

•Problem A SPOJ SUB_PROB   AC自动机 •题意: 给定一个长为M(M≤100000 )的文本串,和N(N≤1000)个长度不超过2000的模式串,问每个模式串是否在文本串中出现过? •几乎和周一课件上的第一个例题一模一样.. •把文本串丢到AC自动机里面去跑. •注意: •1.可能有两个相同的模式串(略坑吧.) •2.一个模式串可能是另一个模式串的后缀,即如果一个点的fail指针指向的点是一个“危险节点”,那么它本身也是一个“危险节点”. 1 #include <ios

CSU-ACM暑假集训基础组七夕专场

•Problem A Codeforces 20C       最短路(dij,spfa) •题意:给出一张n个点m条边的无向图 (2 ≤ n ≤ 105, 0 ≤ m ≤ 105),输出从1到n的任意一条最短路径. •解法:dijkstra或者spfa,用pre数组记录到达每个点最短距离的前驱结点. •注意:路径的长度范围是 1 ≤ wi ≤ 106,从1到n的最短路径长度可能超出int范围. •没有路径从1到达n时要输出-1 1 #include <cstdio> 2 #include &

暑假集训0811

利用树的dfs序解决问题: 就是dfs的时候记录每个节点的进入时间和离开时间,这样一个完整的区间就是一颗完整的数,就转化成了区间维护的问题. 比如hdu3887 本质上是一个求子树和的问题 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <stack>