LeetCode316 去除重复字母

  1. LeetCode316 去除重复字母

    image-20220602144301144
    1. 思路分析

      1. 题意分析

        1. 去除重复字母
        2. 不打乱字母相对位置:如示例2中为acdb,不能为abcd
        3. 字典序最小:bca不行,应该为abc
      2. 解题思路

        1. 使用栈,即单调栈来实现要求1和2,使用boolean[] inStack记录栈中元素达到去重目的

          使用栈的原因:利用栈的先进后出特性,我们可以立即操作刚插入的字符

        2. 当要压栈的元素比栈顶元素小时,弹出栈顶元素,达到

        3. 2有两种情况

          1. 如果stk.peek()这个字符还会出现,则可以pop
          2. 如果stk.peek()这个字符不再出现,则不能pop

          因此需要使用int[] count在最初记录每个字符的个数,在pop前判断栈顶字符是否唯一

        4. 最后pop出的所有元素要reverse

    2. 代码实现

      class Solution {
          public String removeDuplicateLetters(String s) {
              Stack<Character> stk = new Stack<>();
              //因为是ascii码,因此128足够
              boolean[] inStack = new boolean[128];
              int[] count = new int[128];
              //统计各字符的个数
              for (char c : s.toCharArray()) {
                  count[c]++;
              }
      
              for (char c : s.toCharArray()) {
                  count[c]--;
                  //如果已经在stack中则continue
                  if (inStack[c]) {
                      continue;
                  }
                  //如果栈不为空且栈顶元素大于c
                  while (!stk.isEmpty() && stk.peek() > c) {
                      //如果后面没有栈顶元素
                      if (count[stk.peek()] == 0) {
                          break;
                      }
                      inStack[stk.pop()] = false;
                  }
                  stk.push(c);
                  inStack[c] = true;
              }
      
              StringBuilder sb = new StringBuilder();
              while (!stk.isEmpty()) {
                  sb.append(stk.pop());
              }
              return sb.reverse().toString();
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值