解题思路:公式或者动态规划

注意事项:

参考代码:

一、套公式:最少操作数=长字符串长度-最大公共子串长度

#include


二、动态规划——WagnerFischer算法


#include <stdio.h>
#include <string.h>
int myMin(int a, int b) {
    return a < b ? a : b;
}
int main()
{
    int dp[200][200];//矩阵序列
    char a[200],b[200];//存储字符串
    int na,nb;
   
    gets(a);
    na=strlen(a);
    gets(b);
    nb=strlen(b);
   
    // dp[i][j]表示s1[0]-s1[i]子串变成s2[0]-s2[j]一样所需要的字符操作次数
   
    for (int i = 0; i <=nb; i++)
        dp[0][i] = i;
    for (int i = 0; i <=na; i++)
        dp[i][0] = i;
   
    for (int i = 1; i <= na; i++) {
        for (int j = 1; j <= nb; j++) {
            // 若s1[i]==s2[j],则dp[i][j]==dp[i-1][j-1],表示不需要操作
            if (a[i - 1] == b[j - 1])
                dp[i][j] = dp[i - 1][j - 1];
            else
            // 若s1[i]!=s2[j],则可能的操作有替换、插入、删除三种方法,分别由前一步得出,并取最小值。
                dp[i][j] = myMin(myMin(dp[i - 1][j], dp[i - 1][j - 1]), dp[i][j - 1] )+1;
        }
    }
     /*  
    for (int i = 0; i <= na; i++) {
        for (int j = 0; j <= nb; j++) {
            printf("%d ",dp[i][j]);
        }
        printf("\n");
    }
    */
    printf("%d",dp[na][nb]);
    return 0;
}



点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论