zoukankan      html  css  js  c++  java
  • 算法——去除重复字符并使得字典序最小

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

    解题思路:利用单调栈的思想,新添加的从末尾添加,弹出比它大的栈顶元素,这样就能保证有序,且字典序最大。不同的是,必须保证原有字母还存在一个,所以,如果栈顶元素是剩下的唯一的一个字母了,那就不能弹出它。
    所以,该栈不是严格意义的单调栈。

    class Solution {
        public String removeDuplicateLetters(String s) {
            Deque<Character> stack = new LinkedList<>();
    
            for(int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                // 栈中存在了当前字母,那么就不能再添加进去了
                if(stack.contains(c)) continue;
    			// 如果栈顶元素比当前字母大,且后面还会出现该字母,那就弹出它
                while(!stack.isEmpty() && stack.peek() > c && s.indexOf(stack.peek(), i) > 0) stack.pop();
    			// 当前字母入栈
                stack.push(c);
            }
    
            StringBuilder res = new StringBuilder();
    		// 将栈中的元素从底部弹出,就是答案了
            while(!stack.isEmpty()) {
                res.append(stack.pollLast());
            }
    
            return res.toString();
        }
    }
    
  • 相关阅读:
    C#与C++与互操作
    WPF GridView动态添加项并读取数据
    C#使用消息队列(MSMQ)
    使用代码浏览WPF控件模版
    PowerShell将运行结果保存为文件
    opencv + ffmpeg
    vmware
    HttpComponents Downloads
    pytorch 安装
    opencv 3.4.0 的编译
  • 原文地址:https://www.cnblogs.com/lippon/p/14165249.html
Copyright © 2011-2022 走看看