两个字符串的编辑距离--动态规划

字符串的编辑距离,又称为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));
}

我也没看别人的代码,就听说要用动态规划做,就做了如上思考和代码,如有不对,还望指出

 

posted @ 2020-02-27 19:22  小倉唯  阅读(474)  评论(0编辑  收藏  举报