LeetCode 316 Remove Duplicate Letters (队列+贪心)

来源:互联网 发布:篮球比赛赛程软件 编辑:程序博客网 时间:2024/06/05 14:53

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Example:

Given "bcabc"
Return "abc"

Given "cbacdcbc"
Return "acdb"


题目链接:https://leetcode.com/problems/remove-duplicate-letters/

题目大意:删除重复的使剩下的字符串字典序最小

题目分析:先记录每个字符出现的次数,用一个队列维护答案,如果当前字符大于队尾字符则往后加,否则若后面还有当前队尾字符则队尾弹出,将当前字符入队列

public class Solution {    public String removeDuplicateLetters(String s) {        int[] cnt = new int[200];        Arrays.fill(cnt, 0);        int len = s.length();        char ch;        for(int i = 0; i < len; i ++) {            ch = s.charAt(i);            cnt[ch] ++;        }        Deque<Character> dq = new ArrayDeque<>();        for(int i = 0; i < len; i ++) {            ch = s.charAt(i);            cnt[ch] --;            if(dq.contains(ch)) {                continue;            }            if(dq.isEmpty() || dq.peekLast() < ch) {                dq.add(ch);            }            else {                while(!dq.isEmpty() && dq.peekLast() > ch && cnt[dq.peekLast()] > 0) {                    dq.pollLast();                }                dq.add(ch);            }        }        StringBuffer ans = new StringBuffer();        while(!dq.isEmpty()) {            ans.append(dq.peekFirst());            dq.poll();        }        return ans.toString();    }}



0 0
原创粉丝点击