洛谷编辑距离
题目
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
!皆为小写字母!
输入格式
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
输出格式
只有一个正整数,为最少字符操作次数。
代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int f[N][N]; //f数组 第一层表示第a字符的个数第二层表示b字符的个数
char a[N],b[N];
int main(){
scanf("%s",a+1);
getchar();
scanf("%s",b+1);
int lena=strlen(a+1);
int lenb=strlen(b+1);
for(int i=0;i<=10000;i++)
f[i][0]=i; //表示第一个字符串有i个字符变换到第二个字符串有0个字符需要删除i次
for(int i=0;i<=10000;i++)
f[0][i]=i; //表示第一个字符串有0个字符变换到第二个字符有i个字符,需要不断增加,增加i次;
for(int i=1;i<=lena;i++)//循环为f数组赋值
for(int j=1;j<=lenb;j++){
f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1); //f[i][j]可以由a增加字符b删除字符或者a删除b增加
if(a[i]==b[j])//如果相等 说明不用编辑
f[i][j]=min(f[i-1][j-1],f[i][j]);
else //如果最后两位不相等就需要修改
f[i][j]=min(f[i-1][j-1]+1,f[i][j]);//说明上一步是修改
}
cout<<f[lena][lenb]<<endl;
return 0;
}
笔记
这个题需要用一个数组把情况都保存下来,f的第一层第二层分别表示第一个字符串和第二个字符串的字符个数
然后需要把边界初始化,比如第一个字符串为0个字符,和第二个字符串为0个字符
然后通过一个循环,当要求当前情况下的f,需要考虑到它的上一步,如果当前这一步,两个末尾的字符相等了,所以这一步就不需要编辑,也就是不用加1