去除重複字母 LeetCode361

2021-10-09 11:22:30 字數 1239 閱讀 6434

問題描述 :

給你乙個僅包含小寫字母的字串,請你去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小(要求不能打亂其他字元的相對位置)。

示例 1:

輸入: 「bcabc」

輸出: 「abc」

示例 2:

輸入: 「cbacdcbc」

輸出: 「acdb」

輸入說明 :

輸入乙個僅包含小寫字母的字串

輸出說明 :

輸出結果。首尾無多餘空格或空行。

輸入範例 :

cbacdcbc

輸出範例 :

acdb

思路:貪心+棧

用棧來儲存最終返回的字串,並維持字串的最小字典序,每遇到乙個字元,如果這個字元不在棧中,就需要將其入棧,但是入棧之前要將棧中之後還會出現,且字典序比當前元素大的出棧,然後當前元素才能入棧

#include

#include

#include

#include

#include

using

namespace std;

class

solution

stack<

char

> stk;

//棧 map<

char

,int

> last_index_map;

//記錄字元出現的最後位置

set<

char

> seen;

//記錄棧中的字元是否唯一

for(

int i =

0; i < s.

length()

; i++

)for

(int i =

0; i < s.

length()

; i++

) stk.

push

(s[i]);

seen.

insert

(s[i]);

}}string res ="";

while

(!stk.

empty()

)reverse

(res.

begin()

,res.

end())

;return res;}}

;int

main

(void

)

LeetCode 去除重複字母

原題鏈結 316.去除重複字母 給你乙個字串 s 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 示例 1 輸入 s bcabc 輸出 abc 示例 2 輸入 s cbacdcbc 輸出 acdb 提示 可以參考 一看就會,就差手把手教...

316 去除重複字母 leetcode

原題鏈結 本題是就是上一道樂扣將去除k位數字的要求換成了去重.要求同樣是字典序最小.這道題的注意點就是 去重 只出現一次的再大也不能去掉 已經在棧裡的小寫字母不需要再push進入,不管它多小 因此很容易分析出此單調棧是單調遞增棧,到時候將棧內元素pop出再反轉即可 1 class solution ...

leetcode316 去除重複字母

給你乙個字串 s 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 首先記錄每個元素出現的最後位置。然後建立乙個棧和乙個集合。若當前字元已經在集合 現過了,則跳過該字元 反之,如果棧頂元素大於當前字元,且棧頂元素的最後出現位置在當前位置之...