給兩個整數陣列 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...