最长公共子串,编辑距离,最长公共子序列

前言

最长公共串是编辑距离与最长公共子序列的基础,而编辑距离与最长公共子序列应用之处非常广泛。

在单词的和词汇的校验是否正确中,会使用到编辑距离;最长公共子序列算法在文本的diff算法,git和svn中比较代码修改前后的差异,两个文本的相似度计算使用最长公共子序列计算将更加准确,能够保留更多的信息(余弦夹角只能根据词频计算)。在多数的算法解释中,都仅仅是提供公式和代码;他们的代码和公式很容易记住。学习是一个理解的过程,不然只会拿着它解决特定问题,而不能进行扩展。

最长公共串

字符串strA = "acasdef"和字符串strB = "aasdefd";容易得出最长公共串的asdef。
最长公共串是计算两个字符串中连续的最长的相同的 字符串。

行和列相互比较,如果不相等使用0 进行填充,如果相等 取得 左上方的值加1 填充此位置;
根据如下图的矩阵排列,第二行与第一列的a从第一列开始,依次与第二列比较,直到最后一列。这种排列过程形如,a依次与字符串acasdef进行比较。同理第一行第二列的a,依次从第一行开始,然后第二行第二列a,就相当于a与字符串aasdefd进行比较。
在这里插入图片描述
查看一下左上方是什么意思;比如:下图中数字2的左边就是横轴字符退一格,由原来的acas变成aca数字2的上方就是纵轴字符退一个,由原来的aas变成aa 。那么就容易得出了,左上方就是当前横轴strA纵轴strB字符串的前一个字符。
在这里插入图片描述
可能不好理解,我们再来整一个图;看绿色背景的对角线的字符,其实就是横轴的ac纵轴的as;蓝色背景的其实就是 sdefaasd,那么橘黄色背景也很容易得出 defefd 了;两个灰色背景的对角分别是 defdacas比较,defdasde

那么我们得出结论,字符串strA = "acasdef"和字符串strB = "aasdefd",可以出现任何长度的比较。而且先前的 比较的值 已经保存在对应的位置中,那么下次再进行别的位置比较时,若需要用到之前的值,拿来使用即可;这种方法美其名曰动态规划

在这里插入图片描述

编辑距离

编辑距离,横轴和纵轴的字符串计算得出

最长公共子序列

Guess you like

Origin blog.csdn.net/Hello_Ray/article/details/105595470