最長重複子數組(中等)
2020年7月1日
題目來源:力扣
解題
刷了三個月簡單題入門了一下,現在開始刷每日一題
這個最長重複子數組,用動態規劃的方式比較好做,dp數組每次都記錄是否相等,如果相等就在上一個數那裏加一。
class Solution {
public int findLength(int[] A, int[] B) {
int max=0;
int alen=A.length;
int blen=B.length;
int[][] dp=new int[alen+1][blen+1];
for(int i=1;i<=alen;i++){
for(int j=1;j<=blen;j++){
if(A[i-1]==B[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
max=Math.max(max,dp[i][j]);
}
}
}
return max;
}
}
- DP二維數組改一維數組
由二維數組可知,dp[i][j]=dp[i-1][j-1]+1。那麼可以發現這個矩形是斜線遞增的,而且每次都只是依賴上一行的數據,那麼改寫成一維數組,這裏要注意,後面的數據是依賴於前面的數據,前面的數據是用來推導後面的數據,所以前面的數據不依賴後面的數據,我們就需要從後面開始對比,以免影響結果。
還有因爲是一維數組,所以不相等的要實時刷新爲0。
class Solution {
public int findLength(int[] A, int[] B) {
int max=0;
int alen=A.length;
int blen=B.length;
int[] dp=new int[blen+1];
for(int i=1;i<=alen;i++){
for(int j=blen;j>=1;j--){
if(A[i-1]==B[j-1]){
dp[j]=dp[j-1]+1;
max=Math.max(max,dp[j]);
}
else
dp[j]=0;
}
}
return max;
}
}