题目
分析
输入:str1 = “wang” , str2 = “abge”;
输出: 3
我的操作步骤是:先在str1上在str1添加e,在修改n->b,,在str1删除w。
解答
下面逐个对递归公式进行剖析。
剖析之前先看看表格数据,可能更好的理解
str1(i) \ str2(j) | Ø | a | b | g | e |
---|---|---|---|---|---|
Ø | 0 | 1 | 2 | 3 | 4 |
w | 1 | 1 | 2 | 3 | 4 |
a | 2 | 1 | 2 | 3 | 4 |
n | 3 | 2 | 2 | 3 | 4 |
g | 4 | 3 | 3 | 2 | 3 |
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,拙著,博一笑而,文辞粗浅。