Remove Duplicate Letters (hard)
Given "bcabc"
Return "abc"
Given "cbacdcbc"
Return "acdb"Basic Idea
class Solution: def removeDuplicateLetters(self, s): """ :type s: str :rtype: str """ stack = [] instack = [False] * 255 count = [0] * 255 for c in s: count[ord(c)] += 1 # 统计每个字母个数 # 操作stack for c in s: while stack and not instack[ord(c)] and count[ord(stack[-1])] > 0 and ord(stack[-1]) > ord(c): instack[ord(stack[-1])] -= 1 stack.pop() if not instack[ord(c)]: instack[ord(c)] = True stack.append(c) count[ord(c)] -= 1 return ''.join(stack)class Solution { public String removeDuplicateLetters(String s) { int[] count = new int[256]; boolean[] inStack = new boolean[256]; Deque<Character> stack = new ArrayDeque<>(); char[] arr = s.toCharArray(); for (char c : arr) { count[c]++; } for (char c : arr) { if (inStack[c]) { count[c]--; continue; } while (! stack.isEmpty() && stack.peekFirst() > c && count[stack.peekFirst()] > 0) { inStack[stack.pollFirst()] = false; } stack.offerFirst(c); count[c]--; inStack[c] = true; } StringBuilder sb = new StringBuilder(); for (char c : stack) sb.append(c); return sb.reverse().toString(); } }