leetcode 316 Remove Duplicate Letters

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 }
原文地址:https://www.cnblogs.com/hwd9654/p/10966709.html