• 去除重复字符


    此博客链接: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);
        }
    }

    结果

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

    出来混总是要还的
  • 相关阅读:
    redis 配置文件
    mysql的join
    mysql在DOS下的操作
    Echart显示在顶端显示总数
    汇编中,BP,SP有何区别?分别怎么使用?
    汇编函数调用中bp和sp是指什么?
    汇编语言中,SP,BP ,SI,DI作用?
    我对读计算机软件专业硕士的几点看法
    磨刀不误砍柴工
    《自己动手写操作系统》读书笔记——初识保护模式
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14162380.html
Copyright © 2020-2023  润新知