我的代码如下,具体分析可参见文章:
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;
}