給你乙個僅包含小寫字母的字串,請你去除字串中重複的字母,使得每個字母只出現一次。需保證返回結果的字典序最小(要求不能打亂其他字元的相對位置)。
示例 1:
輸入: 「bcabc」
輸出: 「abc」
示例 2:
輸入: 「cbacdcbc」
輸出: 「acdb」
思路:使用棧,並且要使字典序最小,若棧頂元素大於當前元素並且棧頂元素不是唯一的,後續還會出現,則將棧頂元素彈出,將當前元素入棧。
public string removeduplicateletters
(string s)
// 記錄是否在已經得到的字串中
boolean
set =
newboolean[26
];// 記錄每個字元出現的最後乙個位置
int[
newint[26
];for(
int i =
0; i < len; i++
) stack
stack =
newstack
<
>()
;for
(int i =
0; i < len; i++
)while
(!stack.
empty()
&& stack.
peek()
peek()
-'a'
]>= i)
stack.
push
(currentchar)
; set[currentchar -
'a']
=true;}
stringbuilder stringbuilder =
newstringbuilder()
;while
(!stack.
empty()
)return stringbuilder.
tostring()
;}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
每日一題 LeetCode之括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 思路 使用深度優先遍歷實現,每乙個位置要麼是 要麼是 我們用兩個變數left和right儲存 和 的剩餘個數。每次遞迴,left或right減1,字串新增乙個相應的括號,當lef...
每日一題 LeetCode之單詞拆分
給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。說明 拆分時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s leetcode worddict leet code 輸出 true 解釋 返回...