在office中输错了单词,office会在单词下方用红色波浪线标出来,你右击它,在菜单中会提示正确的单词拼法;在翻译词典中输入单词时拼错了某个字母,词典会智能的提示你可能想输入的单词。
其实这里用到的是"编辑距离"的概念,根据维基百科的解释,编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。以begin为例,将它编辑为been,其中一种方案的步骤如下:1.删除g; 2.将i变为e。由于该方案经过了两次编辑操作,因此编辑距离就为2。编辑距离问题就是研究将一个字符串转成另一个字符串需要的最少操作次数。
算法实现
实现计算编辑距离的算法,主要是采用动态规划的思想。
public static int GetDistance(string a, string b) { char[] arr1 = a.ToCharArray(); char[] arr2 = b.ToCharArray(); int[,] D = new int[arr1.Length + 1, arr2.Length + 1]; for (int i = 0; i <= arr1.Length; i++) { D[i, 0] = i; } for (int j = 0; j <= arr2.Length; j++) { D[0, j] = j; } for (int i = 1; i <= arr1.Length; i++) { for (int j = 1; j <= arr2.Length; j++) { D[i, j] = new int[]{ D[i-1,j-1]+(arr1[i-1]==arr2[j-1]?0:1), D[i-1,j]+1, D[i,j-1]+1 }.Min(); } } return D[arr1.Length, arr2.Length]; }
算法应用
到网上找一个英语词典的数据库,就可以实现错误检测的功能。用户输入一个单词后,当数据库中没有查找到该单词,则将编辑距离为1的单词显示给用户,供用户选择。
当用户输入了正确的单词,则显示该单词的解释。