String similarity
Sequence alignment
最近在学习动态规划的时候遇到了这样的问题:
给出两个字符串,求出两个字符串的相似性。相同字符对齐视为匹配,不同字符相对或者有落单的字符都会有penalty,求出最小的penalty.
在普林斯顿的PPT上也有相关的问题:
用动态规划很好思考,对于两个字符串A,B,对于xi∈A,yi∈Bx_i \in A, y_i \in Bxi∈A,yi∈B ,只有三种情况,一是两个字符串相对,二是yiy_iyi落单,xix_ixi和BBB中的下一个字符串yi+1y_{i+1}yi+1匹配,三是xix_ixi落单,yiy_iyi和xi+1x_{i+1}xi+1匹配。在这三种情况中取值最小的。
很轻易就能计算出penalty,例如对于DNA 来说,我们规定如下的对应值:
//动态规划
//假设gap()是字符没有匹配值时的penalty
//mismatch()是两个字符对应的penalty.
int dp(const string &x,const string &y)
{
int a=x.size(),b=y.size();
vector<vector<int> > M(a+1,vector<int>(b+1,0));
for(int i