316. 去除重复字母

知识点:栈;单调

题目描述

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

示例
输入:s = "bcabc"
输出:"abc" 输入:s = "cbacdcbc"
输出:"acdb"

解法一:单调

我们来仔细分析一下这道题目,它结合了很多知识点,因为题目中提出了很多要求。

1.去掉重复的;对于去重最常用的就是set,可以新建一个set往里放元素达到去重的目的;或者可以直接新建一个数组,当我们把元素放到某一容器里时,通过一个标志位来看此元素是否在容器里出现。

2.保证顺序;这个可以用栈来实现,再结合上要求1,那就可以定义一个map,key是字符,value是true或false;只要入栈了那就true,保证后面的一样的元素不会再入栈了。

3.返回的字典序最小;这个要求什么意思,就是说哦比如例1,我们可以返回bca,但是答案应该是abc,因为abc字典序小,这怎么实现呢,我们应该要想到单调栈,比如前面的bc比a要大,在a入栈的时候直接弹走,保证栈是单调递增的。但是这也是有错误的,比如bcab,要是按这样那答案成了ab了,c没了,所以如果a之前栈里的元素在整个数组中只出现了一次,那就不能管单调了,人家都得留下来,就这独苗了。所以说这并不是严格意义上的单调栈。但是也用到了单调栈的思想

class Solution {
public String removeDuplicateLetters(String s) {
Stack<Character> stack = new Stack<>();
int[] count = new int[256]; //记录每个字符的次数;
for(int i = 0; i < s.length(); i++){
count[s.charAt(i)]++;
}
boolean[] instack = new boolean[256]; //记录是否在栈中,用于去重;
for(Character c : s.toCharArray()){
count[c]--;
if(instack[c]) continue; //栈里有这个元素,那再来一个就不用管了;
while(!stack.isEmpty() && c < stack.peek()){
//维持一个单调递增栈;
if(count[stack.peek()] == 0){
break; //独苗不能弹;
}
instack[stack.pop()] = false;
}
stack.push(c);
instack[c] = true;
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}

体会

这道题目很有意思,用到了很多思想,要做熟彻底弄会。

相关链接

去掉重复字母

【LeetCode】316. 去除重复字母的更多相关文章

  1. Java实现 LeetCode 316 去除重复字母

    316. 去除重复字母 给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次.需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 1: 输入: " ...

  2. [Leetcode]316.去除重复字母

    题目 贪心方法 用一个两个数组vector<int>cnt,vector<bool>in_right_place: string res:目前符合条件的字符串,到代码结束的时候 ...

  3. 316 Remove Duplicate Letters 去除重复字母

    给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果.例如:给定 "bcabc"返回 "a ...

  4. [Swift]LeetCode316. 去除重复字母 | Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  5. [LeetCode] Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  6. [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  7. [LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项

    Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...

  8. [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项 II

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  9. [leetcode]3. Longest Substring Without Repeating Characters无重复字母的最长子串

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

随机推荐

  1. AcWing 220. 最大公约数

    给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. #include<bits/stdc++.h> u ...

  2. [NOI2009] 诗人小G [题解]

    诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...

  3. WIN10 GMSSL编译

    从git上拉取GMSSL代码 从http://gmssl.org/上可以拉取,或者直接从git上https://github.com/guanzhi/GmSSL拉也行. 我是在git上下的,文件为gm ...

  4. C语言:读TXT 模拟键盘打字输出

    //#include<ctype.h> #include<stdio.h> #include <windows.h> //#include "string ...

  5. C语言不明白

    C语言查看多字节变量中每单个字节数据的方法代码: #include<stdio.h> void main() { int a=0x21109225;char* pAddress=(char ...

  6. 日志采集工具Flume的安装与使用方法

    安装Flume,参考厦门大学林子雨教程:http://dblab.xmu.edu.cn/blog/1102/ 并完成案例1 1.案例1:Avro source Avro可以发送一个给定的文件给Flum ...

  7. CentOS7创建个人系统启动服务项的方法

    CentOS7.6自定义系统启动项的方法(类似busybox里面的inittab)1.编写属于自己的unit服务文件,命令为my.service[Unit]Description=My-demo Se ...

  8. Oracle19c 如何用rman duplicate 克隆一个数据库。(Backup-Based, no achive log)

    Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...

  9. mysql实现主从复制、读写分离的配置方法(一)

    1. 测试环境 两个CentOS7虚拟机 mysql 5.5-MariaDB master_ip:192.168.1.109 slave_ip:192.168.1.118 2. 配置主服务器 2.1  ...

  10. 动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)

    目录 什么是 WebApiEngine? 开源地址 使用方法 使用 [ApiBind] 标签让任何方法变成 WebApi 对 API 进行分类 自定义 API 名称 复制特性 为整个类配置 WebAp ...