最大公共连续子串(LCS问题)

这里介绍的是求最大公共连续子串的算法,至于非连续的子串问题,可以采用动态规划的方法,具体可参考:

http://blog.csdn.net/v_july_v/article/details/6695482 

这里就不在详述。

 

求最大公共连续子串的思路如下:

用矩阵记录两个字符串所有字符的对比结果,如果某两个字符相同,那么就将矩阵相应位置的值修改为:该位置左上位置值 + 1。

例如,两个字符串 21232523311324 和 312123223445 的矩阵对比结果如下:

0 0 1 0 1 0 1 1 0 0 0 0
0 1 0 2 0 0 0 0 0 0 0 0
0 0 2 0 3 0 1 1 0 0 0 0
1 0 0 0 0 4 0 0 2 0 0 0
0 0 1 0 1 0 5 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 1 0 1 1 0 0 0 0
1 0 0 0 0 2 0 0 2 0 0 0
1 0 0 0 0 1 0 0 1 0 0 0
0 2 0 1 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 1 0 0 1 0 0 0
0 0 1 0 1 0 2 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0

上面举证用红色标记的部分就是两个字符串最长连续子串的对应位置。

 

具体程序如下:

 

#include 

using namespace std;

#define SIZE 20

char* GetLCS(char str1[], char str2[])
{
	// 保存str1和str2对比结果的矩阵
	int matrix[SIZE][SIZE] = {0};
	// 保存对比结果最大值,以及该最大值所处横轴的index
	int maxSubLen=0, index=0; 

	int len1 = strlen(str1);
	int len2 = strlen(str2);

	for (int i=0; i0 && j>0)
				{
					matrix[i][j] = matrix[i-1][j-1] + 1;
				} 
				else
				{
					matrix[i][j] = 1;
				}

				// 判断是否为对比结果的最大值
				if (matrix[i][j] > maxSubLen)
				{
					maxSubLen = matrix[i][j];
					index = i;
				}
			}
		}
	}

	// 打印对比结果矩阵
	cout<


 

程序运行结果如下:

 

参考资料:

http://blog.sina.com.cn/s/blog_455b20c10100929m.html

http://blog.chinaunix.net/space.php?uid=17102734&do=blog&cuid=477508

你可能感兴趣的:(C++,Algorithm)