滑动窗口,同时记录最大长度位置的终止位置,最后求解子串。(题目中的优化策略很重要,就是len<Max时无需继续比较)
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
int start=0;
int Max=0;
string LCS(string str1, string str2) {
// write code here
int Max=0;
int flag=0;
int start1=0, start2=0;
//移动str1
for(int i=0;i<str1.size();i++){
int len=min(str2.size(), str1.size()-i);
if(len<Max){
break;//优化
}
int res=getMax(str1, str2, i, len);
if(res>Max){
Max=res;
start2=start;
}
}
//移动str2
for(int i=0;i<str2.size();i++){
int len=min(str1.size(), str2.size()-i);
if(len<Max){
break;//优化
}
int res=getMax(str2, str1, i, len);
if(res>Max){
Max=res;
start1=start;
flag=1;
}
}
//cout<<Max<<" "<<start1<<endl;
return flag==0?str2.substr(start2-Max+1, Max):str1.substr(start1-Max+1, Max);
}
int getMax(string &str1, string &str2, int index, int len){
int res=0;
int max_len=0;
for(int i=0;i<len;i++){
//cout<<str1[index+i]<<" "<<str2[i]<<endl;
if(str1[index+i]==str2[i]){
res+=1;
}
else{
res=0;
}
if(res>max_len){
max_len=res;
start=i;
}
//cout<<res<<" "<<Max<<endl;
}
return max_len;
}
};