开始的思路是遍历存储每个字符的所有位置,再进行扫描处理,但是实际操作并没有很熟练,于是在讨论区学习后,有了下面的解法!

首先需要知道不同的字符在字符串中的最后的位置(理论上的最优位置)

然后扫描字符串进行处理;这里有几个规则:

  1. 对于不同的字符,字典序靠前的字符应该相对于靠后的字符在位置上尽可能靠前(即index较小);

  2. 依次扫描字符串,每一次需要看是否在stack中存下了字符ch1,如果没有,需要和栈顶的字符ch2进行比较,如果栈顶的字符ch2在字典序中大于ch1且ch2在字符串中的最后的位置比此时的index大,那么栈顶元素弹出(同时其标志位恢复),将ch1压入stack;否则直接把ch1压入stack;

  3. 对于一个已经和另外一个字符进行比较确定位置的字符,其位置应该在之后的操作不更改:这里举例:

    先扫描e,下一个字符是c,且e的位置无法变更,只能在c的前面,即之前保存的e的最后的位置就是此时的index;继续扫描,下一个字符b和c进行比较,这里,会发现,e相对于b,和e相对于c是一样的道理,甚至,如果c 的最后的位置在此时b的后面,那么我们就把c先取消,这时,e相对于b的位置仍无需变换,eb甚至优于之前的ec

  4. 对于已经压入栈的字符,再次遇到时不需要处理,因为之前的位置应该是良好的字典序,再次处理然而会导致字符重复且字典序变差;

具体代码如下:

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;
}
};

以上为参考讨论区的改编!原答案链接

https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/discuss/344686/CPP-or-EASY-or-100-BEATS-TIME-AND-MEM-or-SMALL

leetcode 1081的更多相关文章

  1. LeetCode 1081. Smallest Subsequence of Distinct Characters

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

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

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

  3. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  4. 我竟在arm汇编除法算法里找到了leetcode某道题的解法

    今天讲讲arm汇编中除法的底层实现.汇编代码本身比较长了,如需参考请直接拉到文末. 下面我直接把arm的除法算法的汇编代码转译成C语言的代码贴出来,并进行解析. 因为篇幅有限,所以在此只解析无符号整型 ...

  5. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  6. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  7. [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 ...

  8. 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 ...

  9. 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. 递归实现1-n的全排列(JAVA语言)

    思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...

  2. 攻防世界 reverse Windows_Reverse2

    Windows_Reverse2   2019_DDCTF 查壳: 寻找oep-->dump-->iat修复   便可成功脱壳 int __cdecl main(int argc, con ...

  3. 001-Java学习前基础

    目录 前言 一.Java语言特性(简单概述) 二.JDK.JRE.JVM三者关系 三.java文件的加载与执行 前言 初次在博客园写博客,想通过这种方式把自己学过的东西梳理一遍,加深自己的记忆,笔记中 ...

  4. 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 ...

  5. 将Java编译为本地代码

    将Java编译为本地代码 通常Java程序的执行流程为:将Java代码编译为Byte Code(字节码),然后JVM执行引擎执行编译好的Byte Code.这是一种中间语言的特性,它的好处就是可以做到 ...

  6. Python是啥?为什么这么多职业人和学生就算报班也要学它?!

    嗨,大家好 这里是汐仔 首先我们先来考究一下近几年的头条和新闻. 1.早在2018年python就已经被纳入高考之一了 2.Python加入全国计算机等级考试,从2018年九月起新增为大学计算机二级考 ...

  7. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...

  8. Queue API的几种实现详解

    目录 Queue API的几种方法的使用 ArrayBlockingQueue原理及源码解析 ArrayBlockingQueue的成员变量 ArrayBlockingQueue的offer和put方 ...

  9. Jmeter接口测试-MD5加密-请求验签(完整流程)

    第一部分:先准备好Jmeter 1.在开始编写脚本之前,先要确保你的Jmeter能够正常运行.若你还没有安装Jmeter,可参考以下方法: A.Jmeter需要java运行环境,所以需要下载JDK,J ...

  10. 机器学习03-sklearn.LinearRegression 源码学习

    在上次的代码重写中使用了sklearn.LinearRegression 类进行了线性回归之后猜测其使用的是常用的梯度下降+反向传播算法实现,所以今天来学习它的源码实现.但是在看到源码的一瞬间突然有种 ...