字符串的修改(计算字符串的相似度)

Description

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种: 

1. 删除一个字符; 
2. 插入一个字符; 
3. 将一个字符改为另一个字符。 
对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

Input

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于200。

Output

只有一个正整数,为最少字符操作次数。

Sample Input

sfdxbqw
gfdgw

Sample Output

4

个人思路:

通过递归逐渐求出最小值。(具体思路见《编程之美》计算字符串的相似度)


示例代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 202
//CSD:CalculateStringDistance<span style="white-space:pre">		</span>//通过全局变量,避免重复计算。

int num[N][N]= {{0}};
<p>//目的:计算两个字符串的相似度</p><p>//输入:字符串A[0……n-1], B[0……n-1]</p><p>//输出:两个字符的相似度(最小操作次数)</p>
int CalculateStringDistance(char CSDA[], char CSDB[], int CSDstart1, int CSDstart2, int CSDlen1, int CSDlen2, int num[][N])
{
    if(num[CSDstart1][CSDstart2] != 0)
    {
        return num[CSDstart1][CSDstart2];
    }
    else
    {
        int a, b, c;
        if(CSDstart1>CSDlen1)
        {
            if(CSDstart2>CSDlen2)
            {
                return 0;
            }
            else
            {
                num[CSDstart1][CSDstart2] = CSDlen2 - CSDstart2 + 1;
                return num[CSDstart1][CSDstart2];
            }
        }
        if(CSDstart2>CSDlen1)
        {
            if(CSDstart1>CSDlen1)
            {
                return 0;
            }
            else
            {
                num[CSDstart1][CSDstart2] = CSDlen1 - CSDstart1 + 1;
                return num[CSDstart1][CSDstart2];
            }
        }
        if(CSDA[CSDstart1] == CSDB[CSDstart2])
        {
            num[CSDstart1][CSDstart2] = CalculateStringDistance(CSDA, CSDB, CSDstart1+1, CSDstart2+1, CSDlen1, CSDlen2, num);
            return num[CSDstart1][CSDstart2];
        }
        else
        {
            a = CalculateStringDistance(CSDA, CSDB, CSDstart1+1, CSDstart2, CSDlen1, CSDlen2, num);
            b = CalculateStringDistance(CSDA, CSDB, CSDstart1, CSDstart2+1, CSDlen1, CSDlen2, num);
            c = CalculateStringDistance(CSDA, CSDB, CSDstart1+1, CSDstart2+1, CSDlen1, CSDlen2, num);
            num[CSDstart1][CSDstart2] = CSDminValue(a, b, c)+1;
            return num[CSDstart1][CSDstart2];
        }
    }
}
//功能:计算三个之中的最小值
int CSDminValue(int a, int b, int c)
{
    int min;
    if(a < b)
    {
        min = a;
    }
    else
    {
        min = b;
    }
    if(min > c)
    {
        min = c;
    }
    return min;
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int CSDlen1, CSDlen2;
    int CSDresult;
    char CSDA[N], CSDB[N];
    scanf(" %s %s", CSDA, CSDB);
    CSDlen1 = strlen(CSDA);
    CSDlen2 = strlen(CSDB);
    CSDresult = CalculateStringDistance(CSDA, CSDB, 0, 0, CSDlen1-1, CSDlen2-1, num);
    printf("%d\n", CSDresult);
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值