字首陣列字尾陣列

2021-10-25 10:00:44 字數 1792 閱讀 3220

連續兩天的周賽,雙周賽都用到了,記錄一下。

給你乙個字串 s ,它僅包含字元 『a』 和 'b』​​​​ 。

你可以刪除 s 中任意數目的字元,使得 s 平衡 。我們稱 s 平衡的 當不存在下標對 (i,j) 滿足 i < j 且 s[i] = 『b』 同時 s[j]= 『a』 。

請你返回使 s 平衡 的 最少 刪除次數。

輸入:s = "aababbab"

輸出:2

解釋:你可以選擇以下任意一種方案:

下標從 0 開始,刪除第 2 和第 6 個字元("aababbab" -> "aaabbb"),

下標從 0 開始,刪除第 3 和第 6 個字元("aababbab" -> "aabbbb")。

class

solution

for(

int i = len-

1; i>=

0; i--

)int ans =

min(pre[len-1]

, suf[0]

);for(

int i =

1; i < len; i++

)return ans;}}

;

給你乙個整數陣列 nums 和乙個整數 x 。每一次操作時,你應當移除陣列 nums 最左邊或最右邊的元素,然後從 x 中減去該元素的值。請注意,需要 修改 陣列以供接下來的操作使用。

如果可以將 x 恰好 減到 0 ,返回 最小運算元 ;否則,返回 -1 。

示例 1:

輸入:nums = [1,1,4,2,3], x = 5

輸出:2

解釋:最佳解決方案是移除後兩個元素,將 x 減到 0 。

class

solution

for(

int i = len-

1; i>=

0; i--

)// 第一種寫法,超時,兩層迴圈, pre遞增,suf遞增,時間負載度o(n^2)

// for(int i = 0; i < len; i++)

// }

// 第二種寫法,ac 改變suf遍歷順序,遞減遍歷,因為pre也是遞增遍歷,j永遠不回頭,時間複雜度o(n)

for(

int i =

0, j =

1; i +

1< len; i +=1

)return ant == int_max?-1

:ant;}}

;

—注:本題也可以使用滑動視窗,找到sum-x的連續視窗。

補充,滑動視窗實現

class

solution

if(target <0)

return-1

;int left =

0, right =

0, sum =

0,ans = int_min;

int len = nums.

size()

;while

(left < len)

while

(sum >= target)

// 這裡可以直接break了,下面寫法也ac

if(right == len)left++

;// if(right == len) break;

}int res = ans==int_min?-1

: len-ans;

return res;}}

;

字尾陣列 LCP(最長公共字首)

sa sa陣列儲存的是乙個1 n的全排列,儲存的是 將所有字尾按字典序排序後,串在原串中的位置。即有suffix sa i suffix sa i 1 rank rank陣列儲存的是 suffix i 在所有字尾中按字典序排序的 名次 總結 字尾陣列是 排第幾的是誰?名次陣列是 你排第幾?lcp i...

字尾陣列之最長公共字首

include define maxn 100 int main s maxn s串可以看成abcbc int i,j,k 0 for i 0 i 5 i rank sa i i for i 0 i 5 i if k k j sa rank i 1 當rank k 不等於0的時候,rank i 1計...

字尾陣列入門,字尾陣列模板整理

我自己懶得寫,就是想寫個部落格儲存下大佬的部落格位址 點這模板題 大佬的模板 include include include include include include include include include include include define inf 0x3f3f3f3f d...