題目連結(jié):
題目意譯:
你被給定一字串 s,其包含著星號「*」。
在一次操作中,你可以:
選擇 s 中的一個(gè)星號、
移除位於其左側(cè)的最近非星號字元,並移除該星號本身。
回傳所有星號移除之後的字串。
注:
輸入之生成滿足每一次操作都是合法的。
可以證明結(jié)果字串將永遠(yuǎn)唯一。
限制:
1 ≦ s.length ≦ 10 ^ 5
s 由小寫英文字母以及星號「*」所組成。
上述提及之操作保證可以作用於 s。
範(fàn)例測資:
範(fàn)例 1:
輸入: s = "leet**cod*e"
輸出: "lecoe"
解釋: 由左至右來進(jìn)行移除之程序:
- 在 "leet*cod*e" 中,離第一個(gè)星號最近的字元為 't'。s 變成了 "lee*cod*e"。
- 在 "lee*cod*e" 中,離第二個(gè)星號最近的字元為 'e'。s 變成了 "lecod*e"。
- 在 "lecod*e" 中,離第三個(gè)星號最近的字元為 'd'。s 變成了 "lecoe"。
此時(shí)已經(jīng)沒有星號了,因此我們回傳 "lecoe"。
範(fàn)例 2:
輸入: s = "erase*****"
輸出: ""
解釋: 整個(gè)字串都被移除了,因此我們回傳一個(gè)空字串。
解題思維:
用一個(gè)雙端佇列(Deque)或堆疊(Stack)來維護(hù)即可。不過後者最後的結(jié)果會是反過來的,所以要額外處理。
掃過一次 s,看到非星號字元就丟進(jìn)雙端佇列或堆疊裡;看到星號就把最近的尚未被移除的,即佇列的「尾端」或是堆疊的「頂端」,並移除該字元即可。
最後如果佇列或堆疊不為空就把其內(nèi)容取出來即為所求(除了堆疊,如上所述)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。