lanqiao OJ 239 最优包含

文章介绍了如何通过动态规划方法计算将一个字符串转换成另一个字符串所需的最少操作次数,仅限于删除和修改,以蓝桥云课(AcWing)中的题目为例,展示了如何实现算法并计算两个给定字符串之间的编辑距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.最优包含 - 蓝桥云课 (lanqiao.cn)

这个题和活动 - AcWing编辑距离 差不多可以参考一下

只不过只能进行删除和修改操作 ;;  而我们的目标其实是修改操作 所以我们减去删除长度也就是本来字符串的长度差值就是我们要求的最终要修改的长度 ;

//编译代码不做过多解释,有疑问复习以下上面编译距离的题
#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
const int N = 1010 , INF = 1e9 ;
char a[N] ,b[N] ;
int f[N][N] ;//表示前i个字母由前j个字母转化的最少操作数
int main(){
	scanf("%s" , a + 1 ) ;
	scanf("%s" , b + 1 ) ;
	int n = strlen(a + 1) ;
	int m = strlen(b + 1) ;
	for(int i = 0 ; i <= n ; i++){
		for(int j = 0 ; j <= m ; j ++){
			f[i][j] = 1000000 ;
		}
	}
	for(int i = 0 ; i <= n ; i ++ )f[i][0]  =  i ;
	for(int j = 0 ; j <= m ; j  ++) f[0][j] = j ;
	for(int i = 1 ; i <= n ; i ++ ){
		for(int j = 1 ; j <= m ; j ++ ){
			f[i][j] = f[i-1][j] + 1  ;//只能进行删除操作
			if(a[i] == b[j]) f[i][j] = min(f[i][j] , f[i-1][j-1] ) ;
			else f[i][j] = min(f[i][j] , f[i-1][j-1] + 1) ;
			
		}
	}
	cout << f[n][m] - n + m << endl ;
	return 0 ;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值