`
bcyy
  • 浏览: 1826600 次
文章分类
社区版块
存档分类
最新评论

求两字符串最长公共子序列

 
阅读更多

这是动态规划法 的典型题目,长度为row和长度为col的两个串,如何求他们的最长公共子序列。这个子序列是可以不连续的。

方法:

1 建立(row+1)*(col+1)的二维表,

2. 初始化其首行首列为零

3. 以m串为行,n串为列,那么可以逐行填写。第一行代表n串的第一个字符和m串比较, 第二行代表n串的第一和第二个字符都和m串比较,以此类推。

4. 如果是相同字符,那么就把[m-1][n-1]+1和[m-1[n]和[m][n-1]比较,填入大数。

5. 如此反复填完表,就可以得到最终结果[m][n]

很难一下子说清楚,这里就弥补一下一般书上都没有的C++程序吧:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

class Solution {
public:
	int longestSub(string sa, string sb)
	{
		int row = sa.size();
		int col = sb.size();
		vector<vector<int> > dArray;
		vector<int> rowV(col+1,0);
		for(int i = 0; i<row+1; i++)
		{
			dArray.push_back(rowV);
		}
		for(int r=1; r<row+1; r++)
		{
			for(int c=1; c<col+1; c++)	
			{
				dArray[r][c] = max(dArray[r-1][c], dArray[r][c-1]);
				if(sa[r-1]==sb[c-1])
				{
					dArray[r][c] = max(dArray[r-1][c-1]+1, dArray[r][c]);
				}
				else
				{
					dArray[r][c] = max(dArray[r-1][c-1], dArray[r][c]);
				}
			}//for(int c=1; c<col+1; c++)
		}//for(int r=1; r<row+1; r++)
		return dArray[row][col];
	}//int longestSub(string sa, string sb)
};

int main()
{
	string str1("jisnldjife");
	string str2("isdklnige");
	Solution solu;
	cout<<solu.longestSub(str1, str2);
	cout<<endl;
	return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics