316. 去除重複字母
316. 去除重複字母
難度:中等???
給你一個字串 s
,請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小(要求不能打亂其他字元的相對位置)。
**注意:**該題與 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同
示例 1:
輸入:s = "bcabc"
輸出:"abc"
示例 2:
輸入:s = "cbacdcbc"
輸出:"acdb"
提示:
1 <= s.length <= 104
s
由小寫英文字母組成
題解:
貪心 + 棧 + 雜湊表
比如 字串 s='bac'
,刪除一個字元如何使得得到字典序最小?
解決方法是:遍歷字串 s
,當滿足 s[i]>s[i+1]
的時候,刪除 i
即可得到最小 ,我們將這個字串記住作 關鍵字元
第一種最直接的想法是:遍歷字串,找到 關鍵字元 ,然後去除它 ,但是效率不高
有沒有更優化的解法呢?
嘗試一下做法,以 s = "bcabc"
為例:
遇到 b
,入棧 ,遇到 c
,入棧(滿足字典序列就可以直接入棧);
遇到 a
,此時棧頂部元素為 c
,現在我們站在上帝視角可以看見字串後面還有 c
,因此可以將棧頂元素 c
彈出 ; 此時棧頂元素為 b
,字串後面依然還有 b
,也將其彈出;此時棧已經空了,將 a
入棧;
遇到 b
滿足字典序,入棧;
遇到 c
滿足字典序,入棧;
最終的結果為 abc
c++
class Solution {
public:
string removeDuplicateLetters(string s) {
string st;
vector<int> vis(26),mp(26);
for(int i = 0;i < s.size();i++)
{
mp[s[i] - 'a']++;
}
for(int i = 0;i < s.size();i++)
{
if(!vis[s[i] - 'a'])
{
while(!st.empty() && st.back() > s[i])
{
if(mp[st.back() - 'a'] > 0)
{
vis[st.back() - 'a'] = 0;
st.pop_back();
}
else break;
}
vis[s[i] - 'a'] = 1;
st.push_back(s[i]);
}
mp[s[i] - 'a'] -= 1;
}
return st;
}
};
python
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
from collections import Counter
mp = Counter(s)
vis = set()
st = []
for i in range(len(s)):
if s[i] not in vis:
while len(st) > 0 and st[-1] > s[i]:
if mp[st[-1]] > 0:
vis.remove(st[-1])
st.pop()
else:
break
vis.add(s[i])
st.append(s[i])
mp[s[i]] -= 1
return "".join(st)
參考:
相關文章
- [Leetcode]316.去除重複字母LeetCode
- 力扣-316. 去除重複字母力扣
- leetcode 316.去除重複字母 JavaLeetCodeJava
- LeetCode 316. 去除重複字母 java題解LeetCodeJava
- 【Leetcode每日一題】316. 去除重複字母(棧,貪心)LeetCode每日一題
- 去除重複字母(不同字元的最小序列)問題字元
- List中去除重複物件物件
- python中列表如何去除重複Python
- mongodb如何去除重複資料MongoDB
- 去除DataTable指定列的重複行
- PHP陣列去除空白或重複元素PHP陣列
- 大文字如何按行去除重複值
- NPP++去除文字中的重複行
- 陣列去除重複的幾個方法陣列
- sqlserver根據條件去除重複資料SQLServer
- 如何去除有序陣列中的重複元素陣列
- JAVA 如何實現大文字去除重複行Java
- 如何去除 EXCEL 檔案中的重複行Excel
- 資料處理之去除重複資料
- Python中去除重複資料的方法有哪些?Python
- php多維陣列去除重複值的方法PHP陣列
- 正規表示式去除連續重複的字元字元
- Java基礎之去除List集合中的重複元素Java
- 去除類似AB和BA這樣的重複行
- 好程式設計師分享HashSet實現去除重複元素程式設計師
- php資料庫資料如何去除重複資料呢?PHP資料庫
- Java之ArrayList去除重複元素(包括字串和自定義物件)Java字串物件
- Python連線兩個字串並去除首尾重複子串Python字串
- PHP二維陣列切割為字串並去除重複的值PHP陣列字串
- PHP陣列學習之怎麼去除空白或者重複的元素PHP陣列
- 輸入一段字串,去除字串中重複的字元,並輸出字串字元
- python去除列表中的重複元素,簡單易理解,超詳細解答,步驟分析Python
- 重複
- C++【生成16個不重複字母】(生成不重複隨機數)C++隨機
- 一文搞定Python大小寫轉換,首字母大寫,去除特殊字元Python字元
- JS陣列去重 包含去除多個 NaNJS陣列NaN
- 匹配指定長度不重複字母正規表示式
- axios 重複提交iOS