問題描述 :
給你乙個僅包含小寫字母的字串,請你去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小(要求不能打亂其他字元的相對位置)。
示例 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 請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小 要求不能打亂其他字元的相對位置 首先記錄每個元素出現的最後位置。然後建立乙個棧和乙個集合。若當前字元已經在集合 現過了,則跳過該字元 反之,如果棧頂元素大於當前字元,且棧頂元素的最後出現位置在當前位置之...