IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】316. 去除重复字母。 「单调栈」「哈希表」 -> 正文阅读

[数据结构与算法]【leetcode】316. 去除重复字母。 「单调栈」「哈希表」

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

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

示例 1:

输入:s = “bcabc”
输出:“abc”
示例 2:

输入:s = “cbacdcbc”
输出:“acdb”

提示:

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

思路:

首先来解读一下题目是什么意思.就是尽量按照字典序来排列顺序,但是不能出现重复的字母并且每个出现过的字母都要保留下来至少一个.也就是说符合字典序的就直接保留下来,如果不符合字典序的但是后续不会再出现的也要保留下来,但是如果后续还会出现的字母不符合字典序的话就直接剔除.还有一个就是如果遇到重复的字母时就直接跳过他,因为已经不需要他了hhh

我们可以使用单调栈来做这道题,如果遇到不符合字典序的字母时首先进行判断是否后续还会出现,如果后续不会再出现了就压入栈,要不然就弹出.

因此我们需要两个哈希表来进行字母映射,一个是存储字母出现次数的,一个是用来标记字母是否出现过的.

代码区:

class Solution {
public:
    string removeDuplicateLetters(string s) {
        int n = s.size();
        unordered_map<char, int> vis;//是否出现过的标记
        unordered_map<char, int> nums;//剩余出现次数
        string res;
        stack<char> stk;
        for(int i = 0; i < n; i++){
            nums[s[i]] ++;//先统计每个字母要出现的次数
        }
        for(int i = 0; i < n; i++){
            nums[s[i]]--;//出现了就使剩余出现次数减一
            if(vis[s[i]]){//如果这个字母已经在栈中了就跳过该字母
                continue;
            }
            while(!stk.empty() && s[i] < stk.top()){//如果栈非空并且新的字母比栈顶字母小就说明不符合字典序
                if(nums[stk.top()] == 0){//如果栈顶字母剩余出现的次数已经没了,这个已经是绝唱了,那么就不弹出了
                    break;
                }
                vis[stk.top()] = 0;//如果剩余次数还有的话就使该字母弹出,并且标记变为0
                stk.pop(); 
            }
            stk.push(s[i]);//如果是符合字典序的话就压入栈
            vis[s[i]] = 1;//同时标记上,该字母已经存在了
        }
        while(!stk.empty()){//将栈中的字母取出并且倒置
            res.insert(res.begin(), stk.top());
            stk.pop();
        }
        return res;
    }
};

新手上路,有错请指正;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:43:47  更:2021-10-25 12:44:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:45:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码