思路:首先需要明白的乙個事實就是:如果要求字典序最小,那麼最好就是abcdefg這樣的字串,越小的字母我們希望越要往前排。
入棧:如果當前字元比棧頂字元大或者棧空,並且棧內沒有當前字元,則入棧
出棧:如果棧頂字元比當前字元大,並且當前位置後面還有棧頂字元(避免因為出棧之後後面就沒有該字元入棧了),則出棧
class
solution
linkedlist
stack =
newlinkedlist
<
>()
;//boolean
tag =
newboolean
[128];
//標記字元c是否加入到棧中
//單調棧
for(
char c : cs)
while
(!stack.
isempty()
&&stack.
getlast()
> c && cnt[stack.
getlast()
]>0)
stack.
add(c)
; tag[c]
=true;}
//拼接字串
stringbuilder sb =
newstringbuilder()
;for
(character c : stack)
return sb.
tostring();}}
LeetCode No 316 去除重複字母
大致思路 例如 輸入 s bcabc 輸出 abc b bc bca 由於c比a字典序大,所以這次考慮可以把c彈出去,看到c在後面還會出現,所以可以彈出去 ba a 同理彈b ab abc 可以看到,彈出的時候滿足後進先出,所以可以基本確定這裡需要使用 棧 結構。確定使用棧後,可以這麼來看,一開始b...
316 去除重複字母
給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 我的 超時 class solution string removedu...
316 去除重複字母
給定乙個僅包含小寫字母的字串,去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 bcabc 輸出 abc 示例 2 輸入 cbacdcbc 輸出 acdb 分析 這道題就是,第一去重複,第二就是選擇最小的字串。去重複倒是不難,主...