中等
給你乙個字串s
,請你去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小(要求不能打亂其他字元的相對位置)。
注意:該題與 leetcode 1081相同
示例 1:
輸入:s = "bcabc"
輸出:"abc"
示例 2:
輸入:s = "cbacdcbc"
輸出:"acdb"
一開始以為是直接去重,然後返回字典序最小的排列方式,按照ascii碼排序,然後錯了
關鍵是不能打亂字元的相對位置
按照示例2
s = 'cbacdcbc'
設定乙個棧來儲存最後結果的組成字元
然後依次掃瞄每個字元
在**中使用字典記錄每個字元出現的最後位置
來判斷當前掃瞄到的字元後面是否存在棧中的字元
從而決定能否將棧中的字元彈出
class
solution
:def
removeduplicateletters
(self, s:
str)
->
str:
last_pos =
# 記錄每個字元最後出現的位置
for i, c in
enumerate
(s):
last_pos[c]
= i stack =
for i, c in
enumerate
(s):
if c in stack:
# 當當前字元在棧**現時,跳過本次迴圈
continue
while
len(stack)
>
0and stack[-1
]> c and last_pos[stack[-1
]]> i:
# 當當前字元的ascii碼大於棧中最後乙個字元,同時,棧中最後乙個字元在之後還會出現時,刪除該字元
stack.pop(
)# 入棧
return
''.join(stack)
leetcode316 去除重複字母
給你乙個字串 s 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 首先記錄每個元素出現的最後位置。然後建立乙個棧和乙個集合。若當前字元已經在集合 現過了,則跳過該字元 反之,如果棧頂元素大於當前字元,且棧頂元素的最後出現位置在當前位置之...
leetCode 316 去除重複字母
給你乙個字串 s 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 注意 該題與 1081 相同 示例 1 輸入 s bcabc 輸出 abc 示例 2 輸入 s cbacdcbc 輸出 acdb 先要明白如果在乙個字串中刪去乙個字元需要...
Leetcode 316 去除重複字母
很典型的一道單調棧題目class solution char stack newchar 26 棧頂指標 int top 1 for int i 0 i n i 退棧 如果棧非空 並且 棧的頭元素大於目前元素 並且 棧的頭元素剩餘個數不為0 進行退棧操作 while top 0 stack top ...