zoukankan      html  css  js  c++  java
  • 去除重复字符

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14162380.html

    去除重复字母

    题目链接:https://leetcode-cn.com/problems/remove-duplicate-letters/

    题目

    给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

    注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

    示例 1:

    输入:s = "bcabc"
    输出:"abc"
    示例 2:

    输入:s = "cbacdcbc"
    输出:"acdb"
     

    提示:

    1 <= s.length <= 104
    s 由小写英文字母组成

    题解

    前言

    此题我瞅一眼,就想到华哥说的哈希表,本来就想着不做了,但是看看是中等难道,可能事情没有那么简单。

    错误思路

    按照惯例,这里把字母作为key,而个数记为value。然后对字符排序,即为结果。

    正确思路

    我把题目看错了,人家要求的是有序,还得按照字典序最小,看了一些题解,这题目,是使用栈来做,然后里面说有序,可以利用栈来去重,然后在比较栈顶字母是否比当前字母的字典数小,如果是小的话,就把栈顶元素出栈,把当前元素进栈,这样最后出栈的时候是小的先出栈。需要注意的是,在判断栈顶元素和当前字母大小时,需要判断当前字母后面时候还有和栈顶一样的字母。

    代码

    class Solution {
        public String removeDuplicateLetters(String s) {
            Stack<Character> stack=new Stack();
            for(int i=0;i<s.length();i++)
            {
                char zimu=s.charAt(i);
                if(stack.contains(zimu))
                {
                    continue;
                }
                while(!stack.isEmpty()&&stack.peek()>zimu&&s.indexOf(zimu,s.length())!=-1)
                {
                    stack.pop();
                }
                stack.push(zimu);
            }
            char[] res=new char[stack.size()];
            for(int i=0;i<res.length;i++){
                res[i]=stack.pop();
            }
            return new String(res);
        }
    }

    结果

    也不知道为啥输出不对,我自己走了一遍,下面案例输出的应该和标答一样呢。

    出来混总是要还的
  • 相关阅读:
    MOS
    1- Bluetooth开发
    1- Bluetooth
    MCU 51-10 Infrared Communication
    1- STM32 HAL库学习 GPIO配置点亮LED灯
    MCU 51-9 DS18B20 Temperature Sensor
    MCU 51-8 AD/DA
    C语言讲义——变量(variable)
    C语言讲义——注释
    C语言讲义——“编译、链接”
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14162380.html
Copyright © 2011-2022 走看看