题意:给你了两个基因字符串,问最少经过多少次一下的操作可以使他们匹配:
- Deletion: a letter in x is missing in y at a corresponding position. //删除
- Insertion: a letter in y is missing in x at a corresponding position. //插入
- Change: letters at corresponding positions are distinct//改变
其中删除和插入可以归结为一种运算 在字符串中如果添加一个能够达到最小等同于另外一个字符串删除一个。
解题思路:首先这道题目想到的就是dp,然后discuss里面有用两个串的公共子序列LCS求出的,而且还是
AC了的 但是这种思路是错误的。
例如:ATG TGC 答案是 2 但是 按照上面的求法结果为1.
该题目的算法:也是dp。dp[i][j] 表示第一个字符串的前i个与第二个字符串的前j个匹配最少要经过多少次的操作。
每一个字符的比较就只有匹配或者不匹配。
用递归的思路来讲:最后一个字符只有匹配或者不匹配
所以匹配时:dp[n][m] = min(dp[n-1][m],dp[n][m-1],dp[n-1][m-1]),
不匹配时:dp[n][m] = min(dp[n-1][m],dp[n][m-1],dp[n-1][m-1])+1.
对我来说dp的递归思路比正向的容易理解些,,囧。。。注意dp的初始化。
代码: