Leetcode 每日一题:Decode String

news2024/9/30 3:29:38

写在前面:

最近求职季找工作忙的焦头烂额,同时这个学期的助教工作也比之前的工时多了一倍,昨天又拖更了真的对不起大家~~

今天我们来看一道稍微轻松一点的题,这道题目来源于 Valid Parenthesis,不过在这个基础上对其进行了一定的拓展和难度加深。同样是利用括号的一个“深度优先的”场景,也同样可以利用 stack 进行解决,就让我们一起来看看吧!

题目介绍:

题目信息:

  • 题目链接:https://leetcode.com/problems/decode-string/description/
  • 题目类型:String,Array,Stack
  • 题目难度:Medium
  • 题目来源:Google 高频面试题

题目问题:

  • 给定一个 string 字符串
  • 字符串中包含数字,和中括号
  • 举例:
    • 100[abc] 代表这个 abc 要被重复一百次
    • 3[2[ab]] 代表 ab要被重复两次,而重复两次的结果 abab 则又要被重复三次,即 3 * abab
  • 返回完整的解码字符串

题目想法:

这道题用中括号来进行解码不部份的划分,我们可以很容易联想到我们之前做过的 Leetcode Valid Parenthesis,因为括号内嵌括号的问题正好可以利用类似的 stack 数据结构来进行解决

首先,我们依旧是将所有的原 string 中每一个 char 的元素都放进 stack 中,这样能记录我们的先后顺序,也便于我们后续的操作

而每当我们 iterate 到一个 ']' 括号的时候,我们需要在 stack 中往回找最近的 上一个 ‘[' 在哪里,在找到之后,这两个括号之间的所有 char 字母将会被组合在一起成为一个需要 decode string。我们再从 '[' 前面找,将他前面所有所包含的数字找出来,并将它转化为整数,这个数就是我们需要对这个 decode string 的重复次数。

我们将对应的 decode string 重复对应的次数以后,由尾到头倒序的插回 stack 中,因为 stack 是 LIFO,所以倒叙插入可以保证我们之前取出来的 decode string 在顺序是反的情况下能被正确的插入回去。

在插入回去的时候,我们是将 decode string 的每一个 char 一个个的插入回去,并重复 n 次。

最后,我们将 stack 中的所有元素再全部倒序的提取出来,就是我们想要的 string 了!

题目解法:

  • 定义一个 stack<char>
  • 顺序遍历原 string:
    • 如果不是‘]':
      • 将对应的 char 放入 stack 中
      • 前进到下一次遍历
    • 定义 decode string
    • 遍历直到 stack 的 top 元素是 ‘['
      • decode string += 当前元素
    • stack.pop 去除 [
    • 定义数字 num
    • 遍历直到 stack 为空或者当前 top 不再是数字:
      • num += 当前元素
    • 将 num 转化为整数元素
    • 遍历 num 次:
      • 从后往前遍历 decoded string:
        • 将当前元素插入回 stack
  • 遍历 stack
    • 倒序组合所有元素
  • 返回结果

题目代码:

class Solution {
public:
    string decodeString(string s) {
        stack<char> track;
        
        for(char ch: s){
            if(ch != ']'){
                track.push(ch);
                continue;
            }
            
            //find the previous bracket
            string repeated = "";
            while(track.top() != '['){
                repeated += track.top();
                track.pop();
            }
            
            //find the repeated time;
            track.pop();  //get rid of the [
            string num;
            while(!track.empty() && isdigit(track.top())){
                num += track.top();
                track.pop();
            }
            reverse(num.begin(), num.end());
            int numRepeats = stoi(num);
            
            //reverse the repeat string and repeat for that amount of time:
            //push the intermediete res back to the stack
            for(int i = numRepeats - 1; i >= 0; i--){
                for(int k = repeated.size()-1; k >= 0; k--){
                    track.push(repeated[k]);
                }
            }
        }
        
        //construct everything together
        string finalR;
        while(!track.empty()){
            finalR = track.top() + finalR;
            track.pop();
        }
        return finalR;
    }
};

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

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

相关文章

房产销售系统:SpringBoot技术优化方案

第三章 系统分析 3.1 系统设计目标 房产销售系统主要是为了用户方便对房源信息管理、房源类型管理、房子户型管理、交易订单管理、预约看房管理、评价管理等信息进行查询&#xff0c;也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各…

ESP32聊天机器人之一

想做情感陪伴机器人&#xff0c;看到B站有个项目很有趣&#xff0c;使用一块esp32复刻了B站MeteWu的ESP32大模型聊天项目。 自己做了一些修改&#xff0c;加了一些简单的表情&#xff0c;角色扮演&#xff0c;切换大模型和温湿度传感器等功能。可以用于玩具&#xff0c;聊天机…

第307题|快速掌握 反常积分敛散性判定的方法|武忠祥老师每日一题

解题思路&#xff1a;先判断这个反常积分的敛散性&#xff0c;再讨论a的取值范围; 判断反常积分的敛散性&#xff0c;我们通常有三个方法&#xff1a; &#xff08;1&#xff09;根据定义&#xff0c;通常在原函数比较好求的情况下&#xff0c;可以根据定义 &#xff08;2&am…

IDEA 常用配置和开发插件

件市场中搜索并安装“Git Integration”插件。 一、前言 在本篇文章中我会为大家总结一些我自己常用的配置和开发插件&#xff0c;此外也给大家提供一个建议&#xff0c;可以根据自己的项目需求和个人偏好选择适合的插件。另外&#xff0c;IDEA 也在不断更新&#xff0c;可能会…

『功能项目』战士职业平A怪物掉血【44】

我们打开上一篇43事件中心的项目&#xff0c; 本章要做的事情是给主角增加一个xxxCtrl.cs脚本&#xff0c;再创建一个xxxOpt.cs调用xxxCtrl.cs机制层利用事件中心再写一个主角战士平A对怪物的伤害 首先创建脚本&#xff1a;PlayerCtrl.cs using UnityEngine; public class Pla…

2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年9月20-22日地点&#xff1a;成都…

Java项目: 基于SpringBoot+mybatis+maven服装生产管理系统(含源码+数据库+任务书+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven服装生产管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

0基础跟德姆(dom)一起学AI 数据处理和统计分析02-Linux进阶

* vi编辑器 * 权限相关 * 进程,网络相关 * 压缩和解压缩 * 软件安装-yum方式 * 其它命令 --- 1.过滤和管道命令 shell # grep命令, 用来过滤的 # 格式 grep [-n] 关键字 文件路径 # 从文件中过滤出要查找的内容, -n:表示带行号. # | 管道符, 即: 把前边命令的执行结果,…

Ceisum(SuperMap iClient3D for Cesium)实现平面裁剪

1&#xff1a;参考API文档&#xff1a;SuperMap iClient3D for Cesium 开发指南 2&#xff1a;官网示例&#xff1a;support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#layer 3&#xff1a;SuperMap iServer&#xff1a;欢迎使用 SuperMap iServer 11…

ArcGIS属性表汉字转拼音

直接复制粘贴现成代码&#xff1a; # -*- coding: utf-8 -*-import arcpyfrom arcpy import envimport osimport pypinyin import sys# 不带声调皿stylepypinyin.NORMAL)def pinyin(word): s for i in pypinyin.pinyin(word, stylepypinyin.NORMAL): s .join(…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

PHP省时省力海报在线制作系统小程序源码

省时省力海报在线制作系统&#xff1a;设计小白也能秒变大师 &#x1f3a8; 开篇&#xff1a;告别繁琐&#xff0c;拥抱高效设计 你还在为设计一张海报而熬夜加班吗&#xff1f;还在为找不到合适的素材而焦头烂额吗&#xff1f;别担心&#xff0c;“省时省力海报在线制作系统”…

Linux python pyinstaller 打包问题

1.环境 系统版本:Linux -4.19.91-24.8.el8.ks8.11.x86_64-x86_64-with-kylin-10-Sun python 版本 &#xff1a;3.11.2 pyinstaller &#xff1a;6.10.0 pyinstaller 安装不在说明 2.打包 [rootlocalhost pythonNacos]# /usr/local/python3.11/bin/pyinstaller --onefile…

AI+代码审核平台CodeSec获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

服务器基础知识拓展( Linux 网络操作系统 03)

1 什么是服务器 服务器就是在网络中为其他客户机提供服务的计算机。 服务器是计算机的一种&#xff0c;它是在网络操作系统的控制下为网络环境里的客户机&#xff08;如PC&#xff09;提供共享资源&#xff08;包括查询、存储、计算等&#xff09;高性能计算机&#xff0c;它…

OpenCV class1-C#+winfrom显示控件并内存管理

OpenCV是一个开源的跨平台计算机视觉库,提供了丰富的图像和视频处理算法。它采用C语言编写,并提供了C、Python、Java等多种语言接口,可广泛应用于各种计算机视觉相关领域。OpenCV具有强大的图像处理能力,包括图像滤波、几何变换、特征提取等,同时也支持视频分析、目标检测与跟踪…

Leetcode 516. 最长回文序列 区间dp C++实现

Leetcode 516. 最长回文序列 问题&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 算法1&#xff1a…

如何选择适合企业的高效财税自动化软件

数字化时代&#xff0c;企业财税管理的自动化已成为提高效率、降低成本的重要途径。然而&#xff0c;市面上众多的财税自动化软件让企业在选择合适的方案时感到困惑。本文金智维将介绍如何选择适合企业的高效财税自动化软件&#xff0c;以帮助企业更好地进行运营管理和决策。 1…

部署FileBeat采集日志发送到Kafka集群服务器

为什么要使用FileBeat Logstash功能虽然强大,但是他依赖java,在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而Filebeat就是一个完美的代替者,filebeat是Beat成员之一,基于Go语言开发,没有任何依赖,配置文件简单,格式明了,同时,…

快手自研Spark向量化引擎正式发布,性能提升200%

Blaze 是快手自研的基于Rust语言和DataFusion框架开发的Spark向量化执行引擎&#xff0c;旨在通过本机矢量化执行技术来加速Spark SQL的查询处理。Blaze在快手内部上线的数仓生产作业也观测到了平均30%的算力提升&#xff0c;实现了较大的降本增效。本文将深入剖析blaze的技术原…