zoukankan      html  css  js  c++  java
  • 两个字符串的编辑距离--动态规划

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

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

  • 相关阅读:
    链堆栈的实现
    关于HyperLink的NavigateUrl属性的链接地址参数设置
    //yield return用于无缝实现迭代模式。
    NUnit的使用
    非常不错的数据访问架构
    Dictionary应用
    针对数据分析没态度的几句牢骚
    微软算法面试题(4)
    程序员面试题精选100题(60)判断二叉树是不是平衡的
    C++设计模式单件
  • 原文地址:https://www.cnblogs.com/ogurayui/p/12373812.html
Copyright © 2011-2022 走看看