首页 > 其他分享 >力扣-316. 去除重复字母

力扣-316. 去除重复字母

时间:2024-05-18 11:52:24浏览次数:21  
标签:back 字符 ch nums 316 stk 力扣 vis 去除

1.题目

题目地址(316. 去除重复字母 - 力扣(LeetCode))

https://leetcode.cn/problems/remove-duplicate-letters/

题目描述

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的

字典序最小(要求不能打乱其他字符的相对位置)。

 

示例 1:

输入:s = "bcabc"
输出"abc"

示例 2:

输入:s = "cbacdcbc"
输出:"acdb"

 

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

 

注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同

2.题解

2.1 单调栈+

思路

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    string removeDuplicateLetters(string s) {
        vector<int> nums(26), vis(26);
        // 初始化各元素初始个数
        for(char ch : s){
            nums[ch - 'a']++;
        }

        // 贪心+单调栈解决字符串去重问题
        string stk; // 跳出固有思维, 单调栈是一种算法思维,并不一定非要使用栈
        for(char ch : s){
            // 如果当前字符尚未被访问
            if(!vis[ch - 'a']){
                // 保证单调栈从栈顶到栈底递减(小的字符在栈底,保证字节序小), 当前字符小于栈顶就弹出栈顶
                while(!stk.empty() && ch < stk.back()){
                    // 如果剩余字符数量足够,就弹出
                    if(nums[stk.back() - 'a']){
                        vis[stk.back() - 'a'] = 0; // 更新为未访问状态
                        stk.pop_back(); // 弹出
                    } else{
                        break;
                    }
                }
                // 找到当前字符应有的入栈位置
                stk.push_back(ch);
                vis[ch - 'a'] = 1; // 更新访问标志    
            }
            // 如果当前字符访问过则不入栈, 但还是要更细剩余数量,所以将两种情况合二为一
            nums[ch - 'a']--;
        }
        return stk;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

标签:back,字符,ch,nums,316,stk,力扣,vis,去除
From: https://www.cnblogs.com/trmbh12/p/18199126

相关文章

  • 力扣-901. 股票价格跨度
    1.题目题目地址(901.股票价格跨度-力扣(LeetCode))https://leetcode.cn/problems/online-stock-span/题目描述设计一个算法收集某些股票的每日报价,并返回该股票当日价格的跨度。当日股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包......
  • 力扣-739. 每日温度
    1.题目题目地址(739.每日温度-力扣(LeetCode))https://leetcode.cn/problems/daily-temperatures/题目描述给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,......
  • 力扣-84. 柱状图中最大的矩形
    1.题目介绍题目地址(84.柱状图中最大的矩形-力扣(LeetCode))https://leetcode.cn/problems/largest-rectangle-in-histogram/题目描述给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示......
  • 力扣-96. 下一个更大元素 I
    1.题目题目地址(496.下一个更大元素I-力扣(LeetCode))https://leetcode.cn/problems/next-greater-element-i/题目描述nums1 中数字 x 的下一个更大元素是指 x 在 nums2中对应位置右侧的第一个比 x 大的元素。给你两个没有重复元素的数组 nums1和 nums......
  • labelme去除空图片
    Labelme是一个用于图像标注的开源工具。在使用Labelme进行数据标注后,可能会生成一些空的图像文件(即没有进行标注的图片),这些空图片通常不应该被使用。以下是一个简单的Python脚本,用于检测和删除这些空的标注文件:点击查看代码importosimportjsondefis_image_empty(image_p......
  • 去除两个JSON对象集合中的重复数据
    在jQuery中,要去除两个JSON对象集合中的重复数据,你通常需要比较这两个集合中对象的特定属性来决定是否重复。以下是一个基本的方法,假设我们根据每个对象的id属性来判断是否重复,并且我们将结果保存到第一个集合中,去除掉与第二个集合中重复的项://假设这是你的两个JSON对象集合var......
  • 力扣224.基本计算器(困难)
    题目​ 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。解题思路我们可以使用两个栈nums和ops。nums:存放所有的数字ops:存放所有的数字以外的操作,+/-也看做是一种操作然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops......
  • 力扣第130场双周赛
    判断矩阵是否满足条件给定二维矩阵,判断所有格子是否满足如下条件:如果它下面的格子存在,那么它需要等于它下面的格子如果它右边的格子存在,那么它需要不等于它右边的格子遍历二维矩阵,简单模拟即可。classSolution{public:boolsatisfiesConditions(vector<vector<in......
  • 力扣1553 2024.5.13
    原题网址:此处为链接个人难度评价:1700分析:虽然不知道为什么贪心不对,但总之贪心不对。数据如此大也难以DP,那么只有搜索了。显然有一眼可得的搜索记忆化:记忆当只剩下k个果时还需要几天。值得一提的是,本代码实际上可能并不是一个正解代码,其可能无法在整数域上保证所有答案正确,但在......
  • el-cascader设置为任意一级选项,去除单选按钮以及点击关闭下拉选择
    1、标签组件:<el-cascaderref="cascaderRef1"popper-class="popper-cascader"@change="handleChangeCascader(cascaderRef1)"></el-cascader>2、给popper-cascader设置样式,在element-ui,scss里编写.popper-cascader.el-cascader-panel......