两个字符串的编辑距离--动态规划
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:
1、删除一个字符
2、插入一个字符
3、修改一个字符
动态规划思路:
1、俩字符串比较第一位
2、如果一样,那么总操作数不变,问题转化为“求剩下的字符串的编辑距离”
3、如果不一样,那么必定要经过一次操作(编辑距离+1),比如str1 = "a....." str2="b......",使得两字符串第一位相同,那么我们不看第一位(回到步骤2)
那么操作有3种情况
3.1删掉str1的'a'或给str2加一个'a',别以为”或“的这两个操作有什么不同,经过操作后,剩下给到步骤2的字符串是一样的
3.2删掉str2的'b'或给str1加一个'b'
3.3把str1的'b'改成'a'或把str2的'b'改成'a'
剩下就是考虑界限问题了
1、如果str1是“”,那么编辑距离必然是str2的长度
2、同理,如果str2是“”,那么编辑距离必然是str1的长度
public static int Min(int a, int b, int c) { var temp = a < b ? a : b; return temp < c ? temp : c; } public static int CalcDistance(string str1, string str2) { return Calc(0, 0, str1.ToCharArray(), str2.ToCharArray()); } private static int Calc(int index1, int index2, char[] arr1, char[] arr2) { if (index1 == arr1.Length) { //有一个已经到尽头了,剩下的全是另外一个的插入操作 return arr2.Length - index2; } if (index2 == arr2.Length) { return arr1.Length - index1; } if (arr1[index1] == arr2[index2]) { return Calc(++index1, ++index2, arr1, arr2); } var newIndex1 = index1 + 1; var newIndex2 = index2 + 1; return 1 + Min(Calc(newIndex1, index2, arr1, arr2), Calc(index1, newIndex2, arr1, arr2), Calc(newIndex1, newIndex2, arr1, arr2)); }
我也没看别人的代码,就听说要用动态规划做,就做了如上思考和代码,如有不对,还望指出
★觉得本文有帮助就回复一句夸赞小倉唯的话吧,如:“唯ちゃん最高です”