letcode每日一题-去除重复字母
题目的letcode连接:https://leetcode-cn.com/problems/remove-duplicate-letters/
题目描述如下:
思路:
运用: 贪心 - 用栈
用栈来存储最终返回的字符串,并维持字符串的最小字典序。每遇到一个字符,如果这个字符不存在于栈中,就需
要将该字符压入栈中。但在压入之前,需要先将之后还会出现,并且字典序比当前字符小的栈顶字符移除,然后再将当
前字符压入。
代码实现如下:
public String removeDuplicateLetters(String s) {
HashMap<Character,Integer> last_occurrence =new HashMap<>();
Stack<Character> no_repeat_list=new Stack<>();
for(int i=0;i<s.length();i++){
last_occurrence.put(s.charAt(i),i);
}
HashSet<Character> seen = new HashSet<>();
for(int i=0;i<s.length();i++){
if(!seen.contains(s.charAt(i))){
//在压入之前,需要先将之后还会出现,并且字典序比当前字符小的栈顶字符移除,然后再将当前字符压入。
while(!no_repeat_list.isEmpty() && s.charAt(i) < no_repeat_list.peek() && last_occurrence.get(no_repeat_list.peek()) > i){
seen.remove(no_repeat_list.pop());
}
seen.add(s.charAt(i));
no_repeat_list.push(s.charAt(i));
}
}
StringBuilder result=new StringBuilder();
for (Character tmp:no_repeat_list){
result.append(tmp);
}
return result.toString();
}