参考答案没看明白,干脆自己想了个办法,算是动态规划的改进版吧,不用开二维数组,最后时间是9ms,95%。先画一个矩阵[A.size()][B.size()],横行代表A,竖列代表B。leetcode给出的动态规划的 参考答案好像是横着遍历矩阵,我是斜着,从左上到右下遍历矩阵,这样就不用开二维数组了。
将矩阵按左上到右下的对角线分成两半。两个 (两层的for循环) ,分别用来遍历这两半。两层for循环:第一层用来从第一行第一个遍历到第一行最后一个,或从第一列第一个遍历到第一列最后一个;第二层for用来向右下移动,直到移动到矩阵边界,第二层循环结束,重回第一层。
int findLength(vector<int>& A, vector<int>& B) {
int res=0,alen=A.size(),blen=B.size();
for(int i=0;i<alen;i++){
int len=0; //当前subarray长度,不重复就为0.
for(int j=0;i+j<alen;j++){
if(A[i+j]==B[j]){ //如果当前字符重复,subarray长度+1
len++;
if(len>res) //当前subarray长度比原来最大值大,替换原来最大值。
res=len;
}
else //如果当前字符不重复,subarray长度重新设为0.
len=0;
}
}
for(int k=0;k<blen;k++){ //遍历矩阵的另外一半,和上面的for循环道理一样。
int len=0;
for(int l=0;k+l<blen;l++){
if(B[k+l]==A[l]){
len++;
if(len>res)
res=len;
}
else len=0;
}
}
return res;
}
时间复杂度应该是O(n*m)吧,空间复杂度应该是O(1)。