leetcode 316 Remove Duplicate Letters

Posted hwd9654

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

以上是关于leetcode 316 Remove Duplicate Letters的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 316 Remove Duplicate Letters

LeetCode #316 Remove-Duplicate Letters 数组 字符串

LeetCode 316. Remove Duplicate Letters(贪心)

316. Remove Duplicate Letters

316. Remove Duplicate Letters

316. Remove Duplicate Letters