题目:
给两个字符串,找出它们的最长的公共子串,跟求最长公共子序列不同,这个是求连续的。
思路:
动态规划。
dp[i][j]表示字符串a中[0~i]的子串,字符串b中[0~j]的子串,此时的最大长度。
如果a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+1;
如果a[i]不等于b[j],那么dp[i][j]=0。
变量end存放当前最长公共子串的最后一个元素的下标。
如果最大长度更新,说明end也要发送相应变化。
代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
string findLongestCommonSubstring(string a, string b){
int la = a.size();
int lb = b.size();
vector<vector<int>> dp(la+1,vector<int>(lb+1,0));
int maxLen = -1;
int end;
for (int i = 1; i <= la; i++){
for (int j = 1; j <= lb; j++){
if (a[i - 1] == b[j - 1]){
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (maxLen < dp[i][j]){
maxLen = dp[i][j];
end = i-1;
}
}
}
string str = a.substr(end-maxLen+1,maxLen);
return str;
}
int main()
{
string a = "1AB2345CD";
string b = "12345EF";
string res=findLongestCommonSubstring(a, b);
cout << res;
system("pause");
return 0;
}