C语言实现编辑距离的求解

动态规划

假设source有n个字符,target有m个字符,问题可定义为source[1...n]到target[1...n]的编辑距离。子问题可以定义为source前[1...i]到target前[1...j]的编辑距离(最优子结构)。因此,可以定义状态d[i,j]为从子串source[1...i]到子串target[1...j]之间的编辑距离。
状态递推关系方式分为两种情况,分别是source[i]等于target[j]和source[i]不等于target[j]:
d[i,j]=d[i-1,j-1] + 0; source[i]等于target[j]
d[i,j]=min(d[i,j-1]+1, d[i-1,j-1]+1, d[i-1,j]+1); source[i]不等于target[j]
边界条件:
d[i,0] = source字符串的长度
d[0,j] = target字符串的长度

 C语言实现编辑距离的求解_第1张图片

C语言实现编辑距离的求解_第2张图片

如果两个字符相等,则在从此位置的左,上,左上三个位置中取出最小的值;若不等,则在从此位置的左,上,左上三个位置中取出最小的值再加上1;

第一次,源串第一个字符“j” 与目标串的“j”对比,左,上,左上三个位置中取出最小的值0,因为两字符相等,所以加上0;接着,依次对比“j”→“e”,“j”→“r”,“j”→“r”,,“j”→“y” 到扫描完目标串。

 C语言实现编辑距离的求解_第3张图片

C语言实现编辑距离的求解_第4张图片

C语言实现编辑距离的求解_第5张图片

 

#include
#include 

#define MAX_STRING_LEN 10 
#define min(x,y)  ( x

 完整版代码

#include
#include
#include
#include
using namespace std;
int d[1010][1010];
int dis(char a[],char b[])
{
    int i,j;

    int la=strlen(a);
    int lb=strlen(b);
    for(i=0; i

 

你可能感兴趣的:(ACM)