解题思路

运用动态规划的思想: d[i][j] = 表示第一个字符串str1的前i个字符转换到第二个字符串str2的前j个字符所需要的最小的转换步骤,则当str1[i] == str2[j]时, d[i][j] = d[i-1][j-1]; 当str1[i] != str2[j]时,d[i][j] = min(d[i][j], d[i-1][j-1]+1, d[i-1][j]+1, d[i][j-1]+1);  后三项分别对应修改,删除,添加末尾字符。临界条件为d[i][0] = d[0][i] = i;





注意事项:





参考代码:

#include <stdio.h>

#include <string.h>

#define MAXN 205

#define INF 0x3f3f3f3f;

#define min(a, b) ((a)<(b)?(a):(b))

#define max(a, b) ((a)>(b)?(a):(b))


char str1[MAXN], str2[MAXN];

int d[MAXN][MAXN];


int main()

{

for (int i = 0; i < MAXN; ++i) 

for(int j = 0; j < MAXN; ++j) d[i][j] = INF;

gets(str1+1); gets(str2+1);

int len1 = strlen(str1+1), len2 = strlen(str2+1);

for (int i = 0; i <= max(len1, len2); ++i) d[i][0] = d[0][i] = i;

for (int i = 1; i <= len1; ++i) 

for (int j = 1; j <= len2; ++j)

{

if (str1[i] == str2[j]) { d[i][j] = d[i-1][j-1]; continue; }  // 末尾字符相等

d[i][j] = min(d[i][j], d[i-1][j-1]+1);  // 替换末尾字符

d[i][j] = min(d[i-1][j]+1, d[i][j]);    // 删除末尾字符

d[i][j] = min(d[i][j-1]+1, d[i][j]);    // 末尾添加字符

}

printf("%d\n", d[len1-1][len2-1]);


return 0;

}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

54dsnxm 4年前 回复TA
串一为ab,串二为ba,理论输出应该为2,程序输出为1,有问题