描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
数据范围:
1
≤
∣
s
t
r
1
∣
,
∣
s
t
r
2
∣
≤
5000
1 \le |str1|,|str2| \le 5000
1≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度
O
(
n
2
)
O(n^2)
O(n2),时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
示例1
输入:“1AB2345CD”,“12345EF”
返回值:“2345”
备注:
1
≤
∣
s
t
r
1
∣
,
∣
s
t
r
2
∣
≤
5
000
1 \leq |str_1|, |str_2| \leq 5\,000
1≤∣str1∣,∣str2∣≤5000
代码
class Solution {
public:
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
string LCS(string str1, string str2) {
// write code here
if(str1.size()==0||str2.size()==0)
return NULL;
string str="";
int Max=0;
vector<vector<int>> dp(str1.size()+1,vector<int> (str2.size()+1, 0));
for(int i=1;i<=str1.size();i++){
for(int j=1;j<=str2.size();j++){
if(str1[i-1]==str2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else
dp[i][j]=0;
Max=max(dp[i][j],Max);
}
}
int temp1=0;
int temp2=0;
for(int i=1;i<=str1.size();i++){
for(int j=1;j<=str2.size();j++){
if(dp[i][j]==Max){
temp1=i;
temp2=j;
break;
}
}
if(temp1==i)
break;
}
while(temp1>0&&temp2>=0&&dp[temp1][temp2]>0){
str+=str1[temp1-1];
temp1--;
temp2--;
}
reverse(str.begin(), str.end());
return str;
}
};