zoukankan      html  css  js  c++  java
  • [LeetCode 1081] Smallest Subsequence of Distinct Characters

    Return the lexicographically smallest subsequence of text that contains all the distinct characters of text exactly once.

    Example 1:

    Input: "cdadabcc"
    Output: "adbc"
    

    Example 2:

    Input: "abcd"
    Output: "abcd"
    

    Example 3:

    Input: "ecbacba"
    Output: "eacb"
    

    Example 4:

    Input: "leetcode"
    Output: "letcod"
    

     

    Constraints:

    1. 1 <= text.length <= 1000
    2. text consists of lowercase English letters.

    Key observation: if the current character has not been selected before and is smaller than the previous character(s), then we should try to remove these bigger characters. A special case of this is that a previous character is bigger than the current character but it is the last one of its instances. We can not remove this character because we need each unique character exactly once.

    Based on this, we have the following algorithm:

    1. get character frequency count mapping.

    2. go over input string s, for each character, decrease its count by 1. If the current character c has been picked, go to the next character in s. 

    3. otherwise, remove all bigger characters that can still be added later from the top of the stack. For each popped character, update its picked boolean to false.

    4. add c to the stack and mark its picked boolean to true.

    5. after going over s, return all the remaining characters as the final result.

    class Solution {
        public String removeDuplicateLetters(String s) {
            int[] cnt = new int[26];
            boolean[] picked = new boolean[26];
            for(int i = 0; i < s.length(); i++) {
                cnt[s.charAt(i) - 'a']++;
            }
            ArrayDeque<Character> dq = new ArrayDeque<>();
            for(int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                int diff = c - 'a';
                cnt[diff]--;
                if(picked[diff]) {
                    continue;
                }
                while(dq.size() > 0 && dq.peekLast() > c && cnt[dq.peekLast() - 'a'] > 0) {
                    char rm = dq.pollLast();
                    picked[rm - 'a'] = false;
                }
                dq.addLast(c);            
                picked[diff] = true;
            }
            StringBuilder buffer = new StringBuilder();
            while(dq.size() > 0) {
                buffer.append(dq.pollFirst());
            }
            return buffer.toString();
        }
    }
  • 相关阅读:
    demo2动态加载显示商品详情页
    demo1 动态显示view或弹框 动态隐藏view或弹框
    ios 继承UITableViewController,更改tableview样式
    ios数组基本用法和排序大全
    demo1 动态显示view或弹框 动态隐藏view或弹框
    ios数组基本用法和排序大全
    爬虫从入门到放弃
    软件测试方法
    熟悉项目需求,要知道产品增删修改了哪些内容,才会更快更准确的在该项目入手。
    速达光耀开发版软件关于360安全卫士杀掉的说明
  • 原文地址:https://www.cnblogs.com/lz87/p/12971903.html
Copyright © 2011-2022 走看看