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;
}