最长公共子串

`class Solution {
public:
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
string LCS(string str1, string str2) {
int len1=str1.size();
int len2=str2.size();
int tem=0,last=0,end=0,ma=0;
vectordp(len2+1,0);
string s="-1";
if(!len1 || !len2) return s;
for(int i=1; i<=len1; i++){
last=0;
for(int j=1;j<=len2;j++){
tem=dp[j];
if(str1[i-1]==str2[j-1])
dp[j]=last+1;
else dp[j]=0;
last=tem;
if(ma<dp[j])
{
ma=dp[j];
end=j;
}
}
}

    return ma>0? str2.substr(end-ma,ma):s;
}

};

若str1[i]==str2[j]需要查看str1[i-1]与str2[j-1]是否相等。把这个相等记录在dp[j-1]中,并用tem每次记录暂存然后last时刻更新,用
ma存取最大的dp值,用end记录最后公共相等的位置,最后调用str.substr,输出从end-ma开始的ma个字符。妙啊

posted on 2020-11-18 23:31  timeliar  阅读(47)  评论(0)    收藏  举报