2021年下半年软件设计师下午题——编辑距离算法

文章介绍了编辑距离算法,用于计算两个字符串之间的最小转换次数,包括增、删、改操作。通过动态规划的方法,逐步构建出一个矩阵来存储子问题的解,最终得到源字符串转换为目标字符串的最小操作数。文中提供了C语言的代码示例来计算两个字符串的编辑距离。

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

题目

在这里插入图片描述

分析

输入:str1 = “wang” , str2 = “abge”;
输出: 3
我的操作步骤是:先在str1上在str1添加e,在修改n->b,,在str1删除w。

解答

下面逐个对递归公式进行剖析。
剖析之前先看看表格数据,可能更好的理解

str1(i) \ str2(j)Øabge
Ø01234
w11234
a21234
n32234
g43323
len1 = length(str1), len2 = length(str2);
if len2 = 0; d[i][j] = i;
/**
*当str2为 Ø,str1将一个个删减成空串
*例如:str1= "wang",str2 = "";
*操作次数为:4次
*/

if len1 = 0;  d[i][j] = j;
/**
*当str1为 Ø,str1将一个个增加成目标串
*例如:str1= "",str2 = "wang";
*操作次数为:4次
*/

if str1[i-1] = str2[j-1] ; d[i][j] = d[i-1][j-1];
/**
*就是如果位置上的字符串相同,可以转化成上一步字符串的操作步骤,也就是这一步不做处理。
在表格中也就是当前位置的操作次数等于的左上角的操作次数
*例如:str1=“wa”,str2="a";
*转化成为w-->Ø的转变,操作步骤就是1。
*/

if str1[i-1] ≠ str2[j-1];
d[i][j] = min{d[i-1][j]+1 ,d[i][j-1]+1, d[i-1][j-1]+1};
/**
*这个操作理解就是,在增,删,改三个操作之间选择操作次数最少的。
*/

关于增删改的操作详细介绍文字太难说了。看视频链接: b站视频

#include<stdio.h>

#define N 100

char A[N] = "CTGA";
char B[N] = "ACGCTA";
int d[N][N];

int min(int a, int b){
	return a < b ? a : b;
}

int editdistance(char *str1, int len1, char *str2, int len2){
	int i,j;
	int temp;
	
	for(i = 0; i <= len1; i++){
		d[i][0] = i;
	}
	
	for(j = 0; j <= len2; j++){
		d[0][j] = j;
	}
	
	for(i = 1; i <= len1; i++){
		for(j = 1; j <= len2; j++){
			if(str1[i-1] == str2[j-1]){
				d[i][j] = d[i-1][j-1];
			} else{
				temp = min(d[i-1][j]+1, d[i][j-1]+1);
				d[i][j] = min(temp,d[i-1][j-1]+1);
			}
		}
	}
	return d[len1][len2];
}


int main(){
	int result = editdistance(A,4,B,6);
	printf("操作的次数为:%d\n");
	
	for(int i=0; i<=4; i++){
		for(int j=0; j<=6; j++){
			printf("%d ",d[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

结果如下:
在这里插入图片描述

总结:

本题主要是将大问题转化成子问题,一个一个解决。动态规划罢了。
以上就是我看完视频及看完链接: up
之后的心得吧。
第一次写csdn,拙著,博一笑而,文辞粗浅。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值