0316. Remove Duplicate Letters (M)

Remove Duplicate Letters (M)

题目

Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.

Note: This question is the same as 1081: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/

Example 1:

Input: s = "bcabc"
Output: "abc"

Example 2:

Input: s = "cbacdcbc"
Output: "acdb"

Constraints:

  • 1 <= s.length <= 10^4
  • s consists of lowercase English letters.

题意

删去字符串里重复的字母,使剩下的字母都只出现一次且得到的字符串在所有可能结果中字典序最小。

思路

先遍历一遍统计所有字母出现的次数。

再次遍历字符串,如果当前字符c已经安排在结果字符串s中,则跳过;若还未安排,将c与s中最后一个字符c'进行比较,如果c<c'且c'在之后还会出现,则删除c',重复该操作直到末尾所有满足的c'都被删除,最后将c加到s的末尾。


代码实现

Java

class Solution {
    public String removeDuplicateLetters(String s) {
        Deque<Character> deque = new ArrayDeque<>();
        int[] count = new int[26];
        boolean[] used = new boolean[26];

        for (char c : s.toCharArray()) {
            count[c - 'a']++;
        }

        for (char c : s.toCharArray()) {
            if (!used[c - 'a']) {
                while (!deque.isEmpty() && c < deque.peekLast() && count[deque.peekLast() - 'a'] > 0) {
                    used[deque.peekLast() - 'a'] = false;
                    deque.pollLast();
                }
                deque.offer(c);
                used[c - 'a'] = true;
            }
            count[c - 'a']--;
        }

        StringBuilder sb = new StringBuilder();
        while (!deque.isEmpty()) {
            sb.append(deque.poll());
        }
        return sb.toString();
    }
}
posted @   墨云黑  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程
点击右上角即可分享
微信分享提示