LeetCode No 316 去除重複字母

2022-07-10 17:54:11 字數 819 閱讀 3516

大致思路:

例如:輸入:s = "bcabc"

輸出:"abc"

b->bc>bca(由於c比a字典序大,所以這次考慮可以把c彈出去,看到c在後面還會出現,所以可以彈出去)->ba->a(同理彈b)->ab->abc

可以看到,彈出的時候滿足後進先出,所以可以基本確定這裡需要使用「棧」結構。

確定使用棧後,可以這麼來看,一開始b壓入,c壓入。當要壓入a時,因為此時棧頂元素「c」比「a」字典序大。如若a能在c前面肯定總字典序要更小

那麼這時候看「a」後面還有沒有「c」,顯然有,那麼可以把「c」pop出去,再把「a」壓入。

tip:顯然如果後續在字串遇見已經在棧內的字元。我們可以直接跳過。 (因為如果他在棧頂。沒必要。如果在棧內,棧內的「它」肯定前小後大,所以忽略)

( 這個題解後四段更為詳細

public class solution 

dequeans = new arraydeque(); //棧

for (int i = 0; i < s.length(); i++)

while (!ans.isempty()&&ans.peeklast()>s.charat(i)&&istringbuffer和stringbuilder區別:

stack:棧 資料是後進先出(lifo)

queue:佇列 資料是先進先出(fifo)

deque:雙端佇列 資料可以從兩端進出

LeetCode No316 去除重複字母

思路 首先需要明白的乙個事實就是 如果要求字典序最小,那麼最好就是abcdefg這樣的字串,越小的字母我們希望越要往前排。入棧 如果當前字元比棧頂字元大或者棧空,並且棧內沒有當前字元,則入棧 出棧 如果棧頂字元比當前字元大,並且當前位置後面還有棧頂字元 避免因為出棧之後後面就沒有該字元入棧了 則出棧...

316 去除重複字母

給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 我的 超時 class solution string removedu...

316 去除重複字母

給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 分析 這道題就是,第一去重複,第二就是選擇最小的字串。去重複倒是不難,主...