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

链接1:http://blog.csdn.net/x_xiaoge/article/details/7376220

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

链接3:http://www.cnblogs.com/huangxincheng/archive/2012/11/11/2764625.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;
    }
}

 

posted on 2014-03-22 17:00  雪 狼  阅读(411)  评论(0编辑  收藏  举报

导航