// 1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
int minValue(int t1,int t2,int t3)
{
if(t1 < t2)
{
if(t1 < t3)
return t1;
else
return t3;
}
else
{
if(t2 < t3)
return t2;
else
return t3;
}
}
int CalculateStringDistance(char* strA,int pABegin,int pAEnd,char* strB,int pBBegin,int pBEnd)
{
if(pABegin > pAEnd)
{
if(pBBegin > pBEnd)
return 0;
else
return pBEnd - pBBegin+1;
}
if(pBBegin > pBEnd)
{
if(pABegin > pAEnd)
return 0;
else
return pAEnd - pABegin+1;
}
if(strA[pABegin] == strB[pBBegin])
{
return CalculateStringDistance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
}
else
{
int t1 = CalculateStringDistance(strA,pABegin+1,pAEnd,strB,pBBegin+2,pBEnd);
int t2 = CalculateStringDistance(strA,pABegin+2,pAEnd,strB,pBBegin+1,pBEnd);
int t3 = CalculateStringDistance(strA,pABegin+2,pAEnd,strB,pBBegin+2,pBEnd);
return minValue(t1,t2,t3)+1;
}
}
//DP解法
int distance(char* strA,int lenA,char* strB,int lenB)
{
int *C = (int*)malloc(sizeof(int)*(lenA+1)*(lenB+1));
int i = 0,j = 0;
for(i=0;i<=lenA;i++) // j = 0
C[i*(lenB+1)] = lenA;
for(j=0;j<=lenB;j++) // i = 0
C[j] = lenB;
for(i=1;i<=lenA;i++)
{
for(j=1;j<=lenB;j++)
{
//C[i][j] = min{C[i-1][j]+1,C[i][j-1]+1,C[i-1][j-1]+(A[i-1]==B[j-1])?0:1};
C[i*(lenB+1)+j] = minValue(C[(i-1)*(lenB+1)+j]+1,C[i*(lenB+1)+j-1]+1,C[(i-1)*(lenB+1)+j-1]+((strA[i-1] == strB[j-1])?0:1));
}
}
return C[lenA*(lenB+1)+lenB];
}
int main()
{
char* A = "af";
char* B = "acdef";
int num = CalculateStringDistance(A,0,strlen(A)-1,B,0,strlen(B)-1);
printf("两个字符串的距离:%d
",num);
distance(A,strlen(A),B,strlen(B));
printf("两个字符串的距离:%d
",num);
return 0;
}