每日一练:LeeCode-316. 去除重复字母【字符串操作+单调栈+布尔型变量】

本文是力扣LeeCode-316. 去除重复字母 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

给你一个字符串 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 相同

思路

初做这道题,我一下子就想到了之前有做过 1047. 删除字符串中的所有相邻重复项 题,使用栈方法移除相同项,这道题显然也可以这样做一部分,但是由于这道题要求有三个:

  • 去重
  • 去重字符串中的字符顺序不能打乱 s 中字符出现的相对顺序
  • 字典序最小

笔者这边做完去重和不打乱字符出现的相对顺序后,发现对这道题的要求3束手无策了。于是参考了LeeCode博主labuladong,对这道题的题解,我才发现还可以遇山开山,遇河架桥,666。下面是,我对博主题解的简述和总结:

要求1和2可以直接用如下代码解决

String removeDuplicateLetters(String s) {// 存放去重的结果Stack<Character> stack= new Stack<>();// 布尔数组初始值为 false,记录栈中是否存在某个字符// 输入字符均为 ASCII 字符,所以大小 256 够用了boolean[] inStack = new boolean[256];for (char c : s.toCharArray()) {// 如果字符 c 存在栈中,直接跳过if (inStack[c]) continue;// 若不存在,则插入栈顶并标记为存在stack.push(c);inStack[c] = true;}StringBuilder sb = new StringBuilder();while (!stack.empty()) {sb.append(stack.pop());}// 栈中元素插入顺序是反的,需要 reverse 一下return sb.reverse().toString();
}

bcabc举例,这个算法会返回 “bca”,已经符合要求1和要求2,但是题目希望要的答案是 “abc” 。所以此时需要考虑要求3,如何让字典项最小:以a、b、c、……举例,c的ASCII值大于b,b的ASCII值大于a,如果b比a先进栈,就需要先将b出栈pop,a才可以进栈排前面,如果c比b先进栈,就需要先将c出栈pop,b才可以进栈排前面…… 是否很像单调栈的原理

String removeDuplicateLetters(String s) {Stack<Character> stack= new Stack<>();boolean[] inStack = new boolean[256];for (char c : s.toCharArray()) {if (inStack[c]) continue;// 插入之前,和之前的元素比较一下大小// 如果字典序比前面的小,pop 前面的元素while (!stack.isEmpty() && stack.peek() > c) {// 弹出栈顶元素,并把该元素标记为不在栈中inStack[stack.pop()] = false;}stack.push(c);inStack[c] = true;}StringBuilder sb = new StringBuilder();while (!stack.empty()) {sb.append(stack.pop());}return sb.reverse().toString();
}

对于以上代码,我们输入 s = "bcabc",我们可以得出正确结果 "abc" 了,但是对于s="bcac",结果是ac,结果是不对的。究其根本,在于我们一杆子打死了所有stack.peek() > c 的情况。以 s = "bcac"为例,我们没有考虑到,将b出栈后,后续字符串中有没有b了,c是没问题的,它后面还有,所以,我们需要分情况讨论

  • 如果 stk.peek() 这个字符之后还会出现,那么可以把它 pop 出去,后面再 push 到栈里即可
  • 如果 stk.peek() 这个字符之后不会出现了,那么就不能把它 pop 出去,否则无法在后面找它了

该怎么实现这个效果呢? 计数器统计

最终代码实现

class Solution {public String removeDuplicateLetters(String s) {Stack<Character> stack = new Stack<>();boolean[] inStack = new boolean[256];// 维护一个计数器记录字符串中字符的数量// 因为输入为 ASCII 字符,大小 256 够int[] count = new int[256];for(char a : s.toCharArray()){count[a]++;}for(char c : s.toCharArray()){count[c]--;	// 每遍历过一个字符,都将对应的计数减一if(inStack[c])continue;while(!stack.isEmpty()&&stack.peek()>c){// 如果之后不存在栈顶元素了,则停止 popif(count[stack.peek()]==0)break;// 如果之后还有,则可以大胆 popinStack[stack.pop()] = false;}stack.push(c);inStack[c] = true;}StringBuilder sb = new StringBuilder();while(!stack.isEmpty()){sb.append(stack.pop());}return sb.reverse().toString();                }
}

时间复杂度: O(N)
空间复杂度: O(N)

大佬们有更好的方法,请不吝赐教,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】线程同步+基于BlockingQueue的生产者消费者模型

线程同步基于BlockingQueue的生产者消费者模型 1.线程同步2.生产者消费者模型3.基于BlockingQueue的生产者消费者模型 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.线程同步 在线程互斥写了一份抢票的代码&#xff0c;我们发现虽然加锁解决了抢到负数票的…

C++ 中的耗时计算函数

#include <time.h>int clock_gettime (clockid_t clock_id, struct timespec *tp) 获取当前 clock_id 的时钟值并存储在 tp 中。 其中 tp 是一个 timespec 结构体&#xff0c;在 time.h 头文件中定义&#xff1a; #include <time.h>:struct timespec {time_t t…

Java重修第二天—学习”方法“

通过学习本篇文章可以掌握如下知识 1、方法的定义 2、方法在计算机中的执行流程。 3、方法使用时常见问题 4、Java中方法的参数传递机制 5、方法重载 1 方法是什么 方法是一种语法结构&#xff0c;它可以把一段代码实现的某种功能封装起来&#xff0c;以便重复利用。 方…

第二百四十五

我们在上一章回中介绍了"修改页面导航中遇到的问题"沉浸式状态样相关的内容&#xff0c;本章回中将介绍如何修改Avatar的大小.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在正常使用CirCleAvatar组件时可以通过该组件的radius属性来修改它的…

Java调用百度云语音识别【音频转写】

百度云文档 ttps://ai.baidu.com/ai-doc/SPEECH/Bk5difx01 示例代码: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.json.JSONObject; import org.springframework.stereotyp…

目标检测-One Stage-YOLO v3

文章目录 前言一、YOLO v3的网络结构和流程二、YOLO v3的创新点总结 前言 根据前文目标检测-One Stage-YOLOv2可以看出YOLOv2的速度和精度都有相当程度的提升&#xff0c;但是精度仍较低&#xff0c;YOLO v3基于一些先进的结构和思想对YOLO v2做了一些改进。 提示&#xff1a;…

多端多平台高性能推理引擎

多端多平台高性能推理引擎是AI模型产业应用的关键环节&#xff0c;被视为AI落地的最后一公里。具体来说&#xff0c;这种推理引擎需要部署在多种场景和平台上&#xff0c;包括服务器端、边缘端、移动端和网页前端等&#xff0c;同时还需要满足不同的性能要求。 由于部署环境和…

突破技术边界:R与jsonlite库探秘www.snapchat.com的数据之旅

概述 Snapchat是一款流行的社交媒体应用&#xff0c;它允许用户发送和接收带有滤镜和贴纸的照片和视频&#xff0c;以及创建和观看故事和发现内容。Snapchat的数据是非常有价值的&#xff0c;因为它可以反映用户的行为、偏好和趋势。然而&#xff0c;Snapchat的数据并不容易获…

【LMM 009】MiniGPT-4:使用 Vicuna 增强视觉语言理解能力的多模态大模型

论文描述&#xff1a;MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 论文作者&#xff1a;Deyao Zhu∗ Jun Chen∗ Xiaoqian Shen Xiang Li Mohamed Elhoseiny 作者单位&#xff1a;King Abdullah University of Science and Techn…

JavaScript DOM—节点操作

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在在JavaScript DOM 节点操作以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区…

oracle json包 解析JSON

Oracle数据库中的JSON功能包可以用来解析和处理JSON数据。该功能包提供了一组用于解析和操作JSON数据的函数和过程。 要使用JSON功能包解析JSON数据&#xff0c;首先需要将JSON数据保存为一个Oracle数据库中的JSON类型的列或变量。然后&#xff0c;可以使用JSON功能包中的函数…

亚信安慧AntDB数据库:企业核心业务系统数据库升级改造的可靠之选

在近期召开的“2023年国有企业应用场景发布会”上&#xff0c;亚信安慧公司的核心数据库产品AntDB闪耀登场&#xff0c;技术总监北陌先生针对企业核心业务系统数据库升级改造的关键议题发表了深度分享。他从研发、工程实施和运维管理三个维度细致剖析了当前企业在进行数据库升级…

Python - 深夜数据结构与算法之 DP - 进阶

目录 一.引言 二.经典算法实战 1.House-Robber [198] 2.House-Robber-2 [213] 3.Best-Sell-Time [121] 4.Best-Sell-Time-2 [122] 5.Best-Sell-Time-3 [123] 6.Best-Sell-Time-4 [188] 7.Best-Sell-Time-Coldown [309] 8. Best-Sell-Time-Fee [714] 三.总结 一.引言…

操作系统原理

操作系统原理 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同探索计算机科学领域中的基石之一——操作系统原理。 1. 什么是操作系统原…

【React系列】父子组件通信—props属性传值

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识组件的嵌套 组件之间存在嵌套关系&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&…

爬虫案例 --唯品会口红数据爬取(附源码)

""" 项目名称: 唯品会商品数据爬取 项目描述: 通过requests框架获取网页数据 项目环境: pycharm && python3.8 作者所属: 几许一 . 抓包1. 对唯品会官网进行分析 -- 通过筛选直接搜索商品信息获得商品数据包https://mapi.vip.com/vips-mobile/rest/shop…

基于粒子群算法的参数拟合,寻优算法优化测试函数

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 粒子群算法参数拟合 代码 结果分析 展望 基于粒子群算法的参数拟合(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88698417 摘要 寻优算法,测试…

后端开发——JDBC的学习(三)

本篇继续对JDBC进行总结&#xff1a; ①通过Service层与Dao层实现转账的练习&#xff1b; ②重点&#xff1a;由于每次使用连接就手动创建连接&#xff0c;用完后就销毁&#xff0c;这样会导致资源浪费&#xff0c;因此引入连接池&#xff0c;练习连接池的使用&#xff1b; …

x-cmd pkg | tig - git 文本模式界面

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 tig 由 Jonas Fonseca 于 2006 年使用 C 语言创建的 git 交互式文本命令行工具。旨在开启交互模式快速浏览 git 存储库的信息以及 git 命令的运行。 首次用户 使用 x tig 即可自动下载并使用 在终端运行 eval "…

微服务之间互相调用出现的错误

场景&#xff1a; 微服务A调用微服务B的接口&#xff0c;微服务B的接口请求方式是get类型&#xff0c;传递的参数是JSON格式。 错误&#xff1a; 1、postman&#xff1a;springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserial…