連續兩天的周賽,雙周賽都用到了,記錄一下。
給你乙個字串 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...