洛谷编辑距离

洛谷编辑距离

题目

设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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值