您的位置:首页 > 产品设计 > UI/UE

longest common subsequence

2008-02-29 19:47 405 查看
Following is a DP solution of this problem.




/**//*


Name: LCS.H


Copyright: All Right Reserved 2008 Li Zu-ding


Author: li zu-ding<lizuding@gmail.com>


Date: 29-02-08 08:47


Description: this code is the answer of longest common subsquence(LCS) problem


*/


#include <iostream>


#include <assert.h>




using namespace std;






enum Direct ...{ kNull = 0, kUpperRight, kUpper, kRight };




template <typename T, int size1, int size2>


void length_of_lcs(T (&str1)[size1], T (&str2)[size2],


int (&length)[size1][size2],




Direct (&direct)[size1][size2]) ...{


int i, j;


for (i = 0; i < size1; ++i)


length[i][0] = kNull;


for (j = 0; j < size2; ++j)


length[0][j] = kNull;


for (i = 1; i < size1; ++i)




for (j = 1; j != size2; ++j) ...{




if (str1[i] == str2[j] ) ...{


length[i][j] = length[i-1][j-1] + 1;


direct[i][j] = kUpperRight;




} else ...{




if (length[i-1][j] > length[i][j-1]) ...{


length[i][j] = length[i-1][j];


direct[i][j] = kRight;




} else ...{


length[i][j] = length[i][j-1];


direct[i][j] = kUpper;


}


}


}


}




template <typename T, typename Functor, int size1, int size2>


void construct_lcs(Direct (&direct)[size1][size2],


T (&r_str)[size1],




int i, int j, Functor functor) ...{


if ((0 == i) or (0 == j))


return;




if (kUpperRight == direct[i][j]) ...{


functor(r_str[i]);


construct_lcs(direct, r_str, i-1, j-1, functor);


} else


if (kUpper == direct[i][j])


construct_lcs(direct, r_str, i, j-1, functor);


else


if (kRight == direct[i][j])


construct_lcs(direct, r_str, i-1, j, functor);


}




struct print




...{




void operator()(char c) ...{ cout << c << " "; }


};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: