leetcode 1081
开始的思路是遍历存储每个字符的所有位置,再进行扫描处理,但是实际操作并没有很熟练,于是在讨论区学习后,有了下面的解法!
首先需要知道不同的字符在字符串中的最后的位置(理论上的最优位置)
然后扫描字符串进行处理;这里有几个规则:
对于不同的字符,字典序靠前的字符应该相对于靠后的字符在位置上尽可能靠前(即index较小);
依次扫描字符串,每一次需要看是否在stack中存下了字符ch1,如果没有,需要和栈顶的字符ch2进行比较,如果栈顶的字符ch2在字典序中大于ch1且ch2在字符串中的最后的位置比此时的index大,那么栈顶元素弹出(同时其标志位恢复),将ch1压入stack;否则直接把ch1压入stack;
对于一个已经和另外一个字符进行比较确定位置的字符,其位置应该在之后的操作不更改:这里举例:
先扫描e,下一个字符是c,且e的位置无法变更,只能在c的前面,即之前保存的e的最后的位置就是此时的index;继续扫描,下一个字符b和c进行比较,这里,会发现,e相对于b,和e相对于c是一样的道理,甚至,如果c 的最后的位置在此时b的后面,那么我们就把c先取消,这时,e相对于b的位置仍无需变换,eb甚至优于之前的ec
对于已经压入栈的字符,再次遇到时不需要处理,因为之前的位置应该是良好的字典序,再次处理然而会导致字符重复且字典序变差;
具体代码如下:
class Solution {
public:
string smallestSubsequence(string text) {
stack<char> st;
vector<int> final(128, 0);
vector<bool> mark(128, 0);
for(int i = 0; i < text.size(); i++) {
final[text[i]] = i;
}
for(int i = 0; i < text.size(); i++) {
if (mark[text[i]])
continue;
while(st.size() and st.top() > text[i] and final[st.top()] > i) {
mark[st.top()] = false;
st.pop();
}
st.push(text[i]);
mark[text[i]] = true;
}
string result = "";
while(st.size() > 0) {
result += st.top();
st.pop();
}
reverse(result.begin(), result.end());
return result;
}
};
以上为参考讨论区的改编!原答案链接
leetcode 1081的更多相关文章
- LeetCode 1081. Smallest Subsequence of Distinct Characters
原题链接在这里:https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/ 题目: Return the le ...
- 【leetcode】1081. Smallest Subsequence of Distinct Characters
题目如下: Return the lexicographically smallest subsequence of text that contains all the distinct chara ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 我竟在arm汇编除法算法里找到了leetcode某道题的解法
今天讲讲arm汇编中除法的底层实现.汇编代码本身比较长了,如需参考请直接拉到文末. 下面我直接把arm的除法算法的汇编代码转译成C语言的代码贴出来,并进行解析. 因为篇幅有限,所以在此只解析无符号整型 ...
- 我为什么要写LeetCode的博客?
# 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
随机推荐
- 递归实现1-n的全排列(JAVA语言)
思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...
- 攻防世界 reverse Windows_Reverse2
Windows_Reverse2 2019_DDCTF 查壳: 寻找oep-->dump-->iat修复 便可成功脱壳 int __cdecl main(int argc, con ...
- 001-Java学习前基础
目录 前言 一.Java语言特性(简单概述) 二.JDK.JRE.JVM三者关系 三.java文件的加载与执行 前言 初次在博客园写博客,想通过这种方式把自己学过的东西梳理一遍,加深自己的记忆,笔记中 ...
- PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642
PAT (Advanced Level) Practice 1001 A+B Format (20 分) 凌宸1642 题目描述: Calculate a+b and output the sum i ...
- 将Java编译为本地代码
将Java编译为本地代码 通常Java程序的执行流程为:将Java代码编译为Byte Code(字节码),然后JVM执行引擎执行编译好的Byte Code.这是一种中间语言的特性,它的好处就是可以做到 ...
- Python是啥?为什么这么多职业人和学生就算报班也要学它?!
嗨,大家好 这里是汐仔 首先我们先来考究一下近几年的头条和新闻. 1.早在2018年python就已经被纳入高考之一了 2.Python加入全国计算机等级考试,从2018年九月起新增为大学计算机二级考 ...
- 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果
映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...
- Queue API的几种实现详解
目录 Queue API的几种方法的使用 ArrayBlockingQueue原理及源码解析 ArrayBlockingQueue的成员变量 ArrayBlockingQueue的offer和put方 ...
- Jmeter接口测试-MD5加密-请求验签(完整流程)
第一部分:先准备好Jmeter 1.在开始编写脚本之前,先要确保你的Jmeter能够正常运行.若你还没有安装Jmeter,可参考以下方法: A.Jmeter需要java运行环境,所以需要下载JDK,J ...
- 机器学习03-sklearn.LinearRegression 源码学习
在上次的代码重写中使用了sklearn.LinearRegression 类进行了线性回归之后猜测其使用的是常用的梯度下降+反向传播算法实现,所以今天来学习它的源码实现.但是在看到源码的一瞬间突然有种 ...