获得两字符串的最长公共子字符串

我的代码如下,具体分析可参见文章:

http://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html

/*解决步骤:
    本问题是一个动态规划问题。可以尝试建立二维数组(矩阵),以两个字符串的长度为长和宽
    建立一个二维数组,用来存放中间的标记结果:
        if str1[i] != str2[j] then arr[i][j] = 0
        if str1[i] == str2[j] then 
            if i*j == 0 then arr[i][j] = 1
            else arr[i][j] = arr[i-1] + arr[j-1] + 1
    通过这种关系就可以找到获得二维数组的中间结果。
    遍历二维数组找到值最大的即为最长子数组的长,同时获得该值所在的位置,即为最长子字符串的终止位置
    该方法后贴上递归算法
    
*/
void GetMaxSubString(string str1,string str2)
{
	int i,j;
	int mi,mj;
	int maxLength = 0;
	int len1 = str1.length();
	int len2 = str2.length();
	int arr[len1][len2];
	for (i = 0; i < len1; i++)
    {
        for (j = 0; j < len2; j++)
        {
            if (str1[i] == str2[j])
            {
                if (i == 0 || j == 0)
                {
                    arr[i][j] = 1;
                }
                else
                {
                    arr[i][j] = arr[i - 1][j - 1] + 1;  //累加
                }
            }
            else
            {
                arr[i][j] = 0;
            }
        }
    }
    //嵌套循环找到最长子字符串的字符数
    for (i = 0; i < len1; i++)
    {
        for (j = 0; j < len2; j++)
        {
        	cout<<arr[i][j]<<" ";
            if (arr[i][j] > maxLength)
            {
                maxLength = arr[i][j];
                mi = i;
                mj = j;
            }
        }
        cout<<endl;
    }
    cout<<"i: "<<mi<<" j: "<<mj<<endl;
    cout<<"MaxLength is "<<maxLength<<endl;
    cout<<"The max substring is: ";
	for(int i = maxLength;i>0;i--)
    	cout<<str2[mj-i+1];
   	cout<<endl;
    
}

/*
    递归的思路比较清晰,判断两种情况:
        如果当前位置字符相同,最长的长度为1 + 这个位置后的字符串的最长子字符串的长度
        否则以str1的下一位置为起始位置,str2起始位置不变的字符串长度和str1的起始位置不变,str2的下一位置为起始位置的字符串长度中的最大者
    但是该方法比较耗时间,同时只能获得最长子字符串的长度,得不到最长子字符串
*/
string str1,str2;   //假设已经初始化
int strlen1 = str1.length();
int strlen2 = str2.length();
int i=j=0;
int LCS(int i,int j)
{
    if(i>strlen1-1 || j >strlen2-1)
        return 0;
    if(str1[i] == str2[j])
        return 1+ LCS(i+1.j+1);
    else
        return (LCS(i+1,j)>LCS(i,j+1)?LCS(i+1,j):LCS(i,j+1));
}

int main()
{
	string str1 = "abcdddefg";
	string str2 = "gchchddef";
	GetMaxSubString(str1,str2);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值