LC.718. 最長重複子數組
傳送門
思路1:,因爲數據很小都只有,很顯然類比可以令以
結尾的最大匹配長度。
有狀態轉移方程:
時間複雜度 :
空間複雜度 :
class Solution {
public:
int findLength(vector<int>& a, vector<int>& b) {
int la=a.size(),lb=b.size();
vector<vector<int> >dp(1005,vector<int>(1005,0));
int ans=0;
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++)
{
if(a[i-1]==b[j-1]) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
if(dp[i][j]>ans) ans=dp[i][j];
}
return ans;
}
};
思路2:滑動窗口,讓數組不動,數組左右移動匹配,顯然我們可以枚舉數組的開始位置:
然後對匹配,更新答案即可。
時間複雜度:
空間複雜度:
class Solution {
public:
int findLength(vector<int>& a, vector<int>& b) {
int m=a.size(),n=b.size();
int ans=0,cnt=0,mx=0;
for(int move=1-n;move<=m-1;move++){
mx=cnt=0;
for(int i=max(0,move);i<min(m,n+move);i++)
{
if(a[i]==b[i-move]) cnt++;
else {
mx=max(cnt,mx);
cnt=0;
}
}
mx=max(mx,cnt);
ans=max(ans,mx);
}
return ans;
}
};
思路3:哈希+二分優化,不是很熟就不寫了,待更。