lc316 Remove Duplicate Letters
我们用一个栈来保存最终的返回结果,
现在来看看什么时候能删除一个元素,bcabc走到a的时候发现c大于a而且a后还有c,所以可以删除
由此可见,当array[i]之前的字母较大,且在i之后还有重复的字母,就能删除
如何实现这个逻辑呢?
1) 统计各个字母出现次数abc[26]
2) count[array[i]]--,判断当前栈是否非空,且栈顶元素是否大于array[i],且i之后还有重复元素,即count[栈顶元素] > 0,
若为真则可以删除,弹出栈顶元素,继续检查新栈顶元素。然后将array[i]放入栈中,可以用java自带Stack<>也可以用一个char[]模拟栈操作。
注意若为假,小于的情况放入栈中没有问题,可是等于呢?还继续放入栈?当然不行,直接continue,进入下一次循环即可
3) 最后栈中元素就是删去重复元素,且符合字典顺序的结果
1 class Solution { 2 public String removeDuplicateLetters(String s) { 3 char[] stack = new char[26]; 4 char[] ss = s.toCharArray(); 5 int[] count = new int[256]; 6 boolean[] visited = new boolean[256]; 7 8 for(char c : ss) 9 count[c]++; 10 int idxOfStack = -1; 11 for(char i : ss){ 12 count[i]--; 13 if(visited[i]) 14 continue; 15 16 while(idxOfStack > -1 && stack[idxOfStack] > i && count[stack[idxOfStack]] > 0){ 17 visited[stack[idxOfStack]] = false; 18 idxOfStack--; 19 } 20 21 visited[i] = true; 22 stack[++idxOfStack] = i; 23 } 24 25 StringBuilder sb = new StringBuilder(); 26 for(int i=0; i<=idxOfStack; i++){ 27 sb.append(stack[i]); 28 } 29 return sb.toString(); 30 } 31 }