zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    bzoj2588 Count on a tree
    poco对象生成的几种方式根据你使用不同的ui决定
    airtest本地连接和远程连接
    python音频文件中pcm格式提取
    python提取视频中的音频
    如何理解快速排序的时间复杂度是O(nlogn)
    剑指 Offer 45. 把数组排成最小的数
    剑指 Offer 44. 数字序列中某一位的数字
    剑指 Offer 43. 1~n 整数中 1 出现的次数
    剑指 Offer 41. 数据流中的中位数
  • 原文地址:https://www.cnblogs.com/hwd9654/p/10966709.html
Copyright © 2011-2022 走看看