列表

详情


KS26. 字符串最小变换次数

描述

给定两个字符串,已知可以使用三种方式进行变换
1. 插入一个字符
2. 删除一个字符
3. 更改一个字符
请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字符串2

数据范围:输入字符串的长度满足

输入描述

输入两个字符串

输出描述

最小变换次数

示例1

输入:

hello
helle

输出:

1

原站题解

C++ 解法, 执行用时: 6ms, 内存消耗: 416KB, 提交时间: 2020-09-10

#include <string>
#include <vector>
#include <iostream>

int EditDistance(const std::string& left, const std::string& right) {
    std::vector<int> cost(left.size()+1, 0);
    for (size_t l = 0; l < left.size()+1; l++) {
        cost[l] = l;
    }
    for (size_t r = 0; r < right.size(); r++) {
        int diagonal = cost[0];
        cost[0] = r+1;
        for (size_t l = 1; l <= left.size(); l++) {
            int old = cost[l];
            cost[l] = std::min(std::min(
                cost[l-1]+1,
                cost[l]+1),
                diagonal + static_cast<int>(left[l-1] != right[r]));
//            std::cout << cost[l] << " ";
            diagonal = old;
        }
//        std::cout << std::endl;
    }
    return cost[cost.size()-1];
}

int main(int argc, char** argv) {
    std::string left, right;
    std::getline(std::cin, left);
    std::getline(std::cin, right);

    std::cout << EditDistance(left, right);
    return 0;
}

C 解法, 执行用时: 6ms, 内存消耗: 4236KB, 提交时间: 2020-12-30

#include<stdio.h>
#include<string.h>
#define Len 1000
int Min(int a,int b)
{
    return a<b?a:b;
}
int main(void)
{
    char a[Len],b[Len];
    int dp[Len+1][Len+1];
    int alen,blen;
    scanf("%s",&a);
    scanf("%s",&b);
    alen=strlen(a);
    blen=strlen(b);
    for(int i=0;i<alen;i++)
        dp[i][0]=i;  //边界问题处理
    for(int j=0;j<blen;j++)
        dp[0][j]=j;  //边界问题处理
    for(int i=1;i<=alen;i++)
    {
        for(int j=1;j<=blen;j++)
        {
            if(a[i-1]==b[j-1])
                dp[i][j]=dp[i-1][j-1];
            else
            {
                dp[i][j]=1+Min(dp[i-1][j-1],Min(dp[i][j-1],dp[i-1][j]));
            }
        }
    }
    printf("%d\n",dp[alen][blen]);
    return 0;
}

上一题