求滿足某種條件的子串問題 滑動視窗法

2021-06-27 09:44:44 字數 557 閱讀 8368

維護乙個invariant,視窗對應的子串始終滿足給定條件

滑動的方式是:右邊滑為主迴圈,如果沒有破壞invariant,則到下一輪繼續滑。否則要fix 對invariant的破壞,通過乙個內部迴圈不管滑動左邊並測試,直到重新滿足invariant。在這個過程中記錄invariant的最長值。

適合的題目有

1)最長無重複字元子串

2)摘要問題(最短的、包含了所有給定字元的子串)

3)最長的只有兩個不同字元的子串。

特點都是1)維護乙個invariant。2) 移動右邊,如果破壞了invariant,通過移動左邊來fix。

有些子串問題不滿足第二點,比如01串求最長的01個數相等的子串,當移動右邊破壞invariant的時候,也可以通過繼續移動來fix,而不一定通過移動左邊fix。這個問題適合另一種模版,子段函式問題(比如子段和),求最長的和為sum的子段,這類問題特點是,條件是子段的乙個聚合函式,比如sum。然後又可以通過子段和sum(i,j] = 字首和sum [0,j] - 字首和sum[0,i] 轉化。 特別的,當sum 是0,碰到相同的字首和,則這兩個字首和之間的子段和就是0。

滑動視窗求滿足的子陣列個數

題目 給定陣列arr和整數num,返回有多少個子陣列滿足如下情況 max arr i.j min arr i.j num max arr i.j 表示子陣列arr i.j 中的最大值,min arr i.j 表示子陣列arr i.j 中的最小值。如果陣列長度為 n,請實現時間複雜度為 o n 的解法...

VB6求兩個字串最長公共子串的問題

function lcs byval a as string,byval b as string as string if len a len b 0 then lcs exit function dim la as integer,lb as integer,achar as string,bch...

VB6求兩個字串最長公共子串的問題

function lcs byval a as string,byval b as string as string if len a len b 0 then lcs exit function dim la as integer,lb as integer,achar as string,bch...