您的位置:首页 > 其它

最长公共字串(LCS)最长连续公共字串(LCCS)

2014-03-22 17:00 351 查看
链接1:http://blog.csdn.net/x_xiaoge/article/details/7376220

链接2:http://blog.csdn.net/x_xiaoge/article/details/7376217

链接3:/article/4582433.html

LCS

1、动态规划法:见链接1、3

int LCS( string leftString, string rightString )
{

int lenLeft = leftString.length();
int lenRight = rightString.length();
int **martix;
martix = new int *[lenLeft+1];

for (int i=0; i<=lenLeft; i++)
{
martix[i] = new int [lenRight+1];
}

for (int i = 0; i <= lenLeft; i++)
martix[i][0] = 0;

for (int j = 0; j <= lenRight; j++)
martix[0][j] = 0;

for (int i = 1; i <= lenLeft; i++)
{
for (int j = 1; j <= lenRight; j++)
{
if (leftString[i-1] == rightString[j-1])
{
martix[i][j] = martix[i-1][j-1] + 1;
}
else
{
if (martix[i-1][j] >= martix[i][j-1])
martix[i][j] = martix[i-1][j];
else
martix[i][j] = martix[i][j-1];
}
}
}

return martix[lenLeft][lenRight];
}


  LCCS:

1、递归算法如下:

string GetLongestString(string strTmp1, string strTmp2,string  strTmp3)
{
int len1 = strTmp1.length();
int len2 = strTmp2.length();
int len3 = strTmp3.length();
if (len1 > len2)
{
if (len1 > len3)
{
return strTmp1;
}
}
else if (len2 > len3)
{
return strTmp2;
}
return strTmp3;
}

void LCCS(const std::string& str1, const std::string& str2,std::string& lccs)
{
if(str1.length() == 0 || str2.length() == 0)
return;

if(str1[0] == str2[0])
{
lccs += str1[0];
LCCS(str1.substr(1), str2.substr(1), lccs);
}
else
{
std::string strTmp1,strTmp2,strTmp3;

LCCS(str1.substr(1), str2, strTmp1);
LCCS(str1, str2.substr(1), strTmp2);
LCCS(str1.substr(1), str2.substr(1), strTmp3);
std::string strLongest = GetLongestString(strTmp1, strTmp2, strTmp3);
if(lccs.length() < strLongest.length())
lccs = strLongest;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: