動態規劃和滑動視窗解決最長重複子陣列

2021-10-08 08:43:52 字數 1712 閱讀 8637

給兩個整數陣列 a 和 b ,返回兩個陣列中公共的、長度最長的子陣列的長度。

輸入:a:[

1,2,

3,2,

1]b:[

3,2,

1,4,

7]輸出:3

解釋:長度最長的公共子陣列是 [3,

2,1] 。

1 <= len(a), len(b) <= 1000

0 <= a[i], b[i] < 100

這題一看就知道其實就是求最長公共子串問題,我們就以題中的示例畫個圖來看一下。

最長的公共子陣列就是上面紅色所對應的[3,2,1],長度是3。

遞推公式是

if

(s1.

charat

(i)== s2.

charar

(j))

dp[i]

[j]= dp[i-1]

[j-1]+

1;else

dp[i]

[j]=

0;

有了遞推公式,**就容易多了,我們來看下完整**

public

intfindlength

(int

a,int[

] b)}}

return max;

}

這裡的二維陣列dp長和寬都要加1是為了減少判斷,當然也可以不加1,但這樣會多了一些邊界的判斷,我們來看下不加1的**

public

intfindlength

(int

a,int[

] b)}}

return max;

}

第2種方式是滑動視窗,文字敘述不好理解,我們就以[1, 2, 3, 2, 1]和[3,2,1,4]為例來舉例說明,這兩個陣列我故意弄成兩個長度不一樣的,我們畫個圖來看一下

相當於說第乙個陣列位置不動,第二個陣列每次往右移一位,搞懂了上的分析過程,**就容易多了,我們來看下

public

intfindlength

(int

a,int[

] b)

public

intfindlengthhelper

(int

a,int[

] b)

else

int maxlen =

maxlength

(a, b, astart, bstart, len)

; max = math.

max(max, maxlen);}

return max;

}//計算a和b在上面圖中紅色框內的最大長度

public

intmaxlength

(int

a,int[

] b,

int astart,

int bstart,

int len)

else

}return max;

}

滑動視窗 替換後的最長重複字元

題目鏈結 維護乙個滑動視窗,記錄視窗 現頻率最高的次數maxcnt,當視窗大小 ri ght left ma xcnt k right left maxcnt k right lef t ma xcnt k時,表示當前無法通過替換k個字元滿足要求,這時需要將視窗左邊界右移。在編寫 時,雖然不能保證視...

最長無重複子串 滑動視窗解法

class solution int n s.length int r 256 int map new int r 桶 字元的個數的 int left 0,right 0 視窗的兩個指標 int maxlen integer.min value 最後的結果 boolean notsamechar t...

無重複字元的最長子串(滑動視窗)

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。我們可以定義字元到索引的對映,而不是使用集合來判斷乙個字元是否存在。當我們找到重複的字元時,我們可以立即跳過該視窗。也就是說,如果 s...