leetcode 316 去除重複字母

2021-10-12 12:26:47 字數 1262 閱讀 4875

中等

給你乙個字串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 ...