leetcode5086

问题描述

给定一个字符串s,其中只包含小写字母。求s的一个子序列t。要求t包含s中的全部字符。如果答案有多个,输出字典序最小的那个子序列。

解法描述

首先,为s中每个字符打标签,表示该字符是否为其类型中的最后一个字符

其次,从左往右扫描s,让每个字符进栈。进栈过程中满足如下约束:

  • 当栈顶元素为其类型中的最后一个字符,此元素不可弹出
  • 当栈顶元素不是其类型最后一个字符且比当前字符大,那么栈顶元素应该被弹出,因为后面还有这类字符,所以先把它弹出去。这是最重要的贪心。
  • 当栈中已经包含当前字符时,如果当前字符isLast=true,那么栈中的对应字符不可弹出。
import java.util.Arrays;

class Solution {
public String smallestSubsequence(String text) {
//初始化isLast
boolean[] isLast = new boolean[text.length()];
boolean[] had = new boolean[26];
for (int i = text.length() - 1; i >= 0; i--) {
int c = text.charAt(i) - 'a';
if (!had[c]) {
had[c] = true;
isLast[i] = true;
} else {
isLast[i] = false;
}
}
int[] sta = new int[text.length()];//定义一个栈,栈中存放的是字符的下标
int si = 0;//定义一个栈顶指针
int[] indexOf = new int[26];//每类字符在栈中的位置
Arrays.fill(indexOf, -1);//-1表示字符不在栈中
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (indexOf[c - 'a'] != -1) {//栈中已经包含了此字符,则使用最新字符更新之,这个地方很关键
sta[indexOf[c - 'a']] = i;
continue;
}
while (si > 0) {//当可以弹栈的时候尽量弹栈
int pos = sta[si - 1];//栈顶元素的下表
if (isLast[pos]) break;//如果栈顶元素是该类字符中的最后一个,那么不能弹
char top = text.charAt(pos);//栈顶字符
if (top < c) break;//如果栈顶字符小于当前字符,停止弹栈
//否则,执行弹栈
indexOf[top - 'a'] = -1;
si--;//弹栈
}
sta[si++] = i;//当前元素入栈
indexOf[c - 'a'] = si - 1;
}
//构造答案
StringBuilder ans = new StringBuilder();
for (int i = 0; i < si; i++) ans.append(text.charAt(sta[i]));
return ans.toString();
}
}

leetcode5086:smallest-subsequence-of-distinct-characters的更多相关文章

  1. [Swift]LeetCode1081. 不同字符的最小子序列 | Smallest Subsequence of Distinct Characters

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. LeetCode 1081. Smallest Subsequence of Distinct Characters

    原题链接在这里:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/ 题目: Return the le ...

  3. 【leetcode】1081. Smallest Subsequence of Distinct Characters

    题目如下: Return the lexicographically smallest subsequence of text that contains all the distinct chara ...

  4. [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...

  5. [LeetCode] Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串

    Given a string S, find the length of the longest substring T that contains at most two distinct char ...

  6. Leetcode: Longest Substring with At Most K Distinct Characters && Summary: Window做法两种思路总结

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...

  7. ✡ leetcode 159. Longest Substring with At Most Two Distinct Characters 求两个字母组成的最大子串长度 --------- java

    Given a string, find the length of the longest substring T that contains at most 2 distinct characte ...

  8. LeetCode Longest Substring with At Most Two Distinct Characters

    原题链接在这里:https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/ 题目: Gi ...

  9. LeetCode "Longest Substring with At Most K Distinct Characters"

    A simple variation to "Longest Substring with At Most Two Distinct Characters". A typical ...

  10. [Locked] Longest Substring with At Most Two Distinct Characters

    Longest Substring with At Most Two Distinct Characters Given a string, find the length of the longes ...

随机推荐

  1. Rust中的闭包

    这个功能有点高级, 暂时理解不完全, 先把代码练正确吧. use std::thread; use std::time::Duration; struct Cacher<T> where ...

  2. 201871010118-唐敬博《面向对象程序设计(java)》第十二周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  3. 201871020225-牟星源《面向对象程序设计(java)》第十周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...

  4. python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。

    1.动态参数的作用: 能够接收不固定长度参数 位置参数过多时可以使用动态参数 * args是程序员之间约定俗称(可以更换但是不建议更换) * args获取的是一个元组 ** kwargs获取的是一个字 ...

  5. Access-Control-Allow-Origin 响应一个携带身份信息(Credential)的HTTP请求时,必需指定具体的域,不能用通配符

    https://www.cnblogs.com/raind/p/10771778.html Access-Control-Allow-Origin.HTTP响应头,指定服务器端允许进行跨域资源访问的来 ...

  6. wafer2的keng

    一.之前用wafer2开发的小程序,今天突然Error: 用户未登录过,请先使用 login() 登录? 答:改用qcloud.login, 替换掉qcloud.loginWithCode (小程序代 ...

  7. 【oracle】oracle11g安装失败 提示找不到文件,模板General_Purpose.dbc不存在

    先确定一下自己的安装包是不是一起解压的! 不是就重新解压,重新装. 是,剩下的我也不会

  8. [ Python入门教程 ] Python的控制语句

    Python控制语句由条件语句.循环语句构成.控制语句根据条件表达式控制程序的流转.本章将介绍Python中控制语句的基本语法. 条件判断语句 (1)if条件语句 if语句用于检测某个条件是否成立.如 ...

  9. uniApp上传图片

    项目中用到了上传图片的功能,记录一下.增强记忆. 要上传图片首先就要先选择图片,或者是先拍照,此时先调用的是 chooseImage 接口,此接口可选择拍照也可以从相册中选择. 它有几个参数,具体可以 ...

  10. 分页条件传参bug之解决

    问题描述:以对象作为参数,对象中包含PageNum.PageSize.Condition对象等.对应的@RequestBody为如PageReqDTO reqDTO时,如果使用postman时,不在b ...