LeetCode——去除重复字母(借助栈)

简介: LeetCode——去除重复字母(借助栈)

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

题目描述

image.png

解题思路

本题我们采用栈的思路来解决这个问题,在解决问题之前,首先我们要看懂这个题目,这个题目并不是说对字母去重后直接按照字典序排列的,而是附加了一个条件即不能打乱其他字符的相对位置,如何能保证不打乱其他字符的相对位置呢?可以采用将该元素在字符串中最后一次出现时再加入栈,即使前面加入了也要pop出去.

第一步: 如果字符出现在栈中则直接跳过

if (stack.indexOf(char) > -1) continue;
复制代码

第二步: 如果字符没有出现在栈中,则进行下面的判断

  1. 栈中是否有元素.
  2. 栈顶元素是否大于第i个字符.
  3. 第i个字符后面还有栈顶元素吗?

都满足则让栈顶元素出栈.

while (stack.length > 0 && stack[stack.length -1] > char && s.indexOf(stack[stack.length - 1],i) > i) {
    // 走到这里说明该元素需要跳过
    stack.pop();
}
复制代码

第三步: 将第i个元素入栈

stack.push(char);
复制代码

第四步: 通过join方法将数组连接成字符串

stack.join('')
复制代码

AC代码

image.png

题目反思

  1. 学会使用栈来解决重复字母问题.
  2. 学会通过join方法将数组变为字符串.
  3. 判断一个元素是否在数组中出现过不仅可以通过ES6中的方法,还可以通过indexof与-1的关系来进行判断.
  4. indexof可以接受两个参数,第一个参数代表的是哪一个字符,第二个参数代表的是从哪里开始往后查找,这个知识在解决本题的过程中,发挥了不可磨灭的作用.


相关文章
|
4天前
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
20 0
|
4天前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
36 6
|
4天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
6 0
|
4天前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
11 2
|
4天前
leetcode代码记录(有效的字母异位词
leetcode代码记录(有效的字母异位词
10 1
|
4天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
4天前
|
C语言
Leetcode每日一题——“用栈实现队列”
Leetcode每日一题——“用栈实现队列”
|
4天前
|
C语言
Leetcode每日一题——“用队列实现栈”
Leetcode每日一题——“用队列实现栈”
|
4天前
【力扣】1832.判断句子是否为全字母句
【力扣】1832.判断句子是否为全字母句
|
4天前
leetcode热题100. 字母异位词分组
leetcode热题100. 字母异位词分组
18 0