题目
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
数据范围: 1≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度 O(n2),时间复杂度 O(n2)
思路
利用一个二维数组来记录一个字符串的每一个位置和其他位置的匹配结果,匹配上为1,没有匹配上为0,下一个字符串位置对应的数组的对角线,因此将对角线的值更新,然后记录最大值的位置,和最长的公共字符串长度,最后得到最长公共子串。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# longest common substring
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @return string字符串
#
class Solution:
def LCS(self , str1: str, str2: str) -> str:
# write code here
len1 = len(str1)
len2 = len(str2)
max_len = 0
memory = [[0 for j in range(len2+1)] for i in range(len1+1)]
for i in range(1, len1+1):
for j in range(1, len2+1):
if(str1[i-1]==str2[j-1]):
memory[i][j] = memory[i-1][j-1]+1
if max_len < memory[i][j]:
max_len = memory[i][j]
index = i
res = str1[index-max_len:index]
return res
c++版本:
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
vector<vector<int>> dp(str1.size()+1, vector<int>(str2.size()+1, 0));
int max_len = 0;
int index = 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;
if(max_len < dp[i][j]){
max_len=dp[i][j];
index = i-1;
}
}
}
}
int start_index = index - max_len + 1;
return str1.substr(start_index, max_len);
}
};