大疆测试工程师笔试编程题

1,579 阅读1分钟
题目描述:输入两个字符串str1和str2,输出它们公共的最长子串,如果有多个结果,取较短字符串中从左到右最早出现的那个子串。请编程实现并在注释中简单描述算法思想。 

输入: 输入数据为两个长度不同的字符串,每个字符串最大长度为1000 

输出: 按照题目要求,输出一个字符串;若无公共子串,则输出为空 

样例输入:

asd12345qwer 

asdd1234_5qwerfff 

样例输出:

d1234

这是一个动态规划的题目,刚好最近自己也在看这方面,把它复盘一下

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

using namespace std;

void func(string str1, string str2)
{
	int len1 = str1.length();
	int len2 = str2.length();
	int max = 0;
	int end = 0;
	vector<vector<int> > dp(len1 + 1, vector<int>(len2 + 1, 0));
	for (int i = 1; i < len1; i++)
	{
		for (int j = 1; j < len2; j++)
		{
			if (str1[i - 1] == str2[j - 1])
			{
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}
			if (dp[i][j] > max)
			{
				max = dp[i][j];
				end = i;
			}
		}
	}
	cout << str1.substr(end - max, max) << endl;
}


int main()
{
	string str1;
	string str2;
	getline(cin, str1);
	getline(cin, str2);
	func(str1, str2);
	return 0;
}