leetcode刷題筆記 棧4

2021-10-05 14:30:52 字數 1694 閱讀 8316

給出由小寫字母組成的字串 s,重複項刪除操作會選擇兩個相鄰且相同的字母,並刪除它們。

在 s 上反覆執行重複項刪除操作,直到無法繼續刪除。

在完成所有重複項刪除操作後返回最終的字串。答案保證唯一。

輸入:"abbaca"

輸出:"ca"

解釋:例如,在 "abbaca" 中,我們可以刪除 "bb" 由於兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重複項。之後我們得到字串 "aaca",其中又只有 "aa" 可以執行重複項刪除操作,所以最後的字串為 "ca"。

這道題用棧可以很容易的解決:

class

solution

:def

removeduplicates

(self, s:

str)

->

str:

output=

for ch in s:

if output and ch==output[-1

]:output.pop(

)else

:return

"".join(output)

給你乙個字串 s,「k 倍重複項刪除操作」將會從 s 中選擇 k 個相鄰且相等的字母,並刪除它們,使被刪去的字串的左側和右側連在一起。

你需要對 s 重複進行無限次這樣的刪除操作,直到無法繼續為止。

在執行完所有刪除操作後,返回最終得到的字串。

本題答案保證唯一。

輸入:s =

"deeedbbcccbdaa"

, k =

3輸出:"aa"

解釋:

先刪除 "eee" 和 "ccc",得到 "ddbbbdaa"

再刪除 "bbb",得到 "dddaa"

最後刪除 "ddd",得到 "aa"

這道題是上面那道題的強化版本,把兩個重複的字母改為可以指定的任意個字母,因而這道題在應用棧來操作時,實際上是使用乙個二維陣列來實現的。

這道題的核心思想就是記錄每個字母的數目,然後與指定的數字進行比較,將相同的對應的字母出棧,最後再把棧裡面的字母拼接起來,這道題不可以使用雜湊表或字典來做,原因是這裡面的字母是有一定先後順序的。

在二維陣列中,每個陣列含有兩個元素:output[-1][0]即字母和output[-1][1]即字母對應的數字。下面看看解法:

class

solution

:def

removeduplicates

(self, s:

str, k:

int)

->

str:

output=

n=len(s)

for ch in s:

ifnot output or ch!=output[-1

][0]

:[ch,1]

)elif output[-1

][1]

+1output[-1

][1]

+=1else

: output.pop(

)print

(output)

numout=

""for i,l in output:

numout+=i*l

return numout

leetcode刷題筆記4

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。class solution def findrepeatnumber self,nums ...

leetcode刷題筆記 棧1

給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...

LeetCode刷題筆記 155 最小棧

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。略看sdc1的時候感覺getmin 有問題,但其實push 和pop 寫的很巧妙 比如依次錄入5,4,...