在词项独立的矫正方法中,有一种叫做编辑距离的方法。
给定两个字符串s1和s2,两者的编辑距离定义为将s1转换成s2的最小编辑操作数。
这些编辑操作包括:
- 将一个字符插入字符串中
- 将一个字符从字符串中删除
- 将字符串中的一个字符替换为另外一个字符
对于加权的编辑距离,假定删除一个字符的权重为delCost,替换字符的权重定义为键盘上按键的曼哈顿距离dist[i][j],插入一个字符的代价为insertCost。
于是有
dp[i][j] = min(min(dp[i-1][j-1]+if(s1[i]==s2[j]) then 0 else dist[i][j],dp[i-1][j]+delCost),del[i][j-1]+delCost);
对于边界有dp[i][0] = i ; dp[0][j] = j * insertCost;
附代码如下:
//karsbin 2012.11.13
/*
*加权编辑距离,动态规划
*在搜索引擎拼写矫正中,通过键盘按键的曼哈顿距离给编辑距离赋权值
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
const int maxn = 1024 ;
int dist[32][32] ;
int dp[maxn][maxn] ;
int delCost = 6 ; //删除一个字符的代价
int insertCost = 6