利用flag信号解决LeetCode题库第394题字符串解码问题

news2024/11/16 8:43:36

394. 字符串解码

中等

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"

输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"

输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"

输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"

输出:"abccdcdcdxyz"

分析:

对于一个输入的原始字符串s,我的想法是:

1、先把这个字符串分解为基本的子字符串

基本的子字符串有以下几种形式:

(1)一是形如3[a],一个数字加上中括号中的字符或字符串

(2)一是形如3[ab2[c]3[bc]],除了有数字,中括号里面还嵌套的有数字和中括号,是一种复合形式,需要层层剥去中括号,直到不含中括号为止

(3)另一种是ef或xyz这种不含数字和中括号的纯字母字符串

2、然后对每一个子字符串分别进行解码处理

3、最后将解码之后的字符串按顺序拼合起来,即得到问题的结果。

下表可以看出这种处理的过程

函数mdecode(s)可以对分解之后的子字符串进行解码处理

那么如何将一个原始字符串s分解为符合条件的子字符串呢?

为了使分割的方法更具有通用性,我们使用了一个列表a来记录分割的位置,首先把字符串s的0索引位置加入在a中,然后找到第一个数字的位置,并把这个位置索引加入a,如果0索引位置就是数字的话,则有重复的位置号,后面再去重即可解决。当找到“]”之后,将从之前找到的数字位置到这个“]”位置进行切片,注意要包含这个“]”字符,并判断切出的字符串中“[”“]”的个数是否相等,如果相等则将“]”的索引加入a列表。按照这个的方法重复操作直到s的结尾,最后再把结束索引加入列表a。

对a去重,通过a中给定的索引号位置,对s进行切片处理即可分割为一些基本的子字符串,并存储于列表b中

程序如下:

#函数mdecode(s),对形如‘abc'或3[bc]之类的字符串进行解码
def mdecode(s):
    if '[' not in s and ']' not in s:
        return s
    else:
        i=s.index('[')
        n=s[:i]
        ms=s[i+1:len(s)-1]
        return ms*int(n)

def cl(s):
    n=len(s)
    a=[0]
    flag=False #flag为False,则开始取子字符串,为True则还未到字符串结束位置
    start=0    
    for i in range(n):
        if s[i] in '123456789' and not flag:
            a.append(i)
            start=i
            flag=True
        elif s[i]==']':
            x=s[start:i+1]
            if x.count('[')==x.count(']'):
                a.append(i+1)
                flag=False
    a.append(n)

    #a去重
    b=list(set(a))
    for i in b:
        if a.count(i)>1:
            a.remove(i)
    print('子字符串起始和结束位置索引号:',a)
    b=[]
    for i in range(len(a)-1):
        x=s[a[i]:a[i+1]]
        b.append(x)
    print('子字符串列表:',b)

    a=''
    for i in b:
        a+=mdecode(i)
    return a
#输入字符串s
s=input('pls input s=')
while True:
    a=cl(s)
    if a.count('[')==0:
        break
    else:
        s=cl(a)
        
print('解码之后的字符串:',a)

运行实例1

pls input s=abc3[a]2[d]xy
子字符串起始和结束位置索引号: [0, 3, 7, 11, 13]
子字符串列表: ['abc', '3[a]', '2[d]', 'xy']
解码之后的字符串: abcaaaddxy
 

运行实例2

pls input s=3[a2[bc]3[b]]
子字符串起始和结束位置索引号: [0, 13]
子字符串列表: ['3[a2[bc]3[b]]']
子字符串起始和结束位置索引号: [0, 1, 6, 10, 11, 16, 20, 21, 26, 30]
子字符串列表: ['a', '2[bc]', '3[b]', 'a', '2[bc]', '3[b]', 'a', '2[bc]', '3[b]']
子字符串起始和结束位置索引号: [0, 24]
子字符串列表: ['abcbcbbbabcbcbbbabcbcbbb']
解码之后的字符串: abcbcbbbabcbcbbbabcbcbbb

运行实例3

pls input s=3[ab2[c]3[bc]ac]
子字符串起始和结束位置索引号: [0, 16]
子字符串列表: ['3[ab2[c]3[bc]ac]']
子字符串起始和结束位置索引号: [0, 2, 6, 11, 15, 19, 24, 28, 32, 37, 39]
子字符串列表: ['ab', '2[c]', '3[bc]', 'acab', '2[c]', '3[bc]', 'acab', '2[c]', '3[bc]', 'ac']
子字符串起始和结束位置索引号: [0, 36]
子字符串列表: ['abccbcbcbcacabccbcbcbcacabccbcbcbcac']
解码之后的字符串: abccbcbcbcacabccbcbcbcacabccbcbcbcac

运行实例4

pls input s=efg

子字符串起始和结束位置索引号: [0, 3]

子字符串列表: ['efg']

解码之后的字符串: efg

运行实例5

pls input s=3[2[ab2[b]2[c]]]
子字符串起始和结束位置索引号: [0, 16]
子字符串列表: ['3[2[ab2[b]2[c]]]']
子字符串起始和结束位置索引号: [0, 13, 26, 39]
子字符串列表: ['2[ab2[b]2[c]]', '2[ab2[b]2[c]]', '2[ab2[b]2[c]]']
子字符串起始和结束位置索引号: [0, 2, 6, 10, 12, 16, 20, 22, 26, 30, 32, 36, 40, 42, 46, 50, 52, 56, 60]
子字符串列表: ['ab', '2[b]', '2[c]', 'ab', '2[b]', '2[c]', 'ab', '2[b]', '2[c]', 'ab', '2[b]', '2[c]', 'ab', '2[b]', '2[c]', 'ab', '2[b]', '2[c]']
解码之后的字符串: abbbccabbbccabbbccabbbccabbbccabbbcc

感悟:

在解决问题的过程中,刚开始程序只能处理简单的情况,也就是只有一层中括号的情况,对于那种有中括号嵌套的复合字符串还是无法处理,让我好一阵失望,这才让我去思考更为通用的解码方法。

问题是慢慢解决的,不可能一口吃一个胖子。

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

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

相关文章

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一:jq 的ajax(在 vue 中不推荐同时使用)方案二:js 原始官方 fetch方法方案三:axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

HTML(二)

一、表格标签 1.1表格的主要作用 表格主要用于显示、展示数据,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理。 1.2 表格的…

yolov5交互式界面 V5.0-6.0版本通用界面-yolo-pyqt-gui(通用界面制作+代码)

往期热门博客项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 yolo GUI OYQT界面 YOLOv5…

yarn按包的时候报错 ../../../package.json: No license field

运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了

【文献分享】强各向异性扩散方程的高效高阶数值求解器

An efficient high-order numerical solver for diffusion equations with strong anisotropy DOI: 10.1016/j.cpc.2022.108333 强各向异性扩散方程的高效高阶数值求解器 在本文中,我们提出了一种内部惩罚不连续 Galerkin 有限元方案,用于解决聚变应…

低代码平台与自动化软件开发的关系

引言 随着信息技术的不断发展,软件开发领域也在不断演进。在追求更高效、更快速的软件开发过程中,低代码平台和自动化软件开发技术日益受到关注。低代码平台以其可视化开发界面和快速构建应用的能力,为非专业开发人员提供了参与软件开发的机会…

2016年认证杯SPSSPRO杯数学建模C题(第二阶段)如何有效的抑制校园霸凌事件的发生全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现: 近年来,我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的,因此对于这些情况我们应该…

win11安装不符合要求怎么办

安装win11不符合要求怎么办?安装Win11需要一定的配置支持,比如42位cpu、464GB内存、9寸以上的屏幕,以及需要TPM(受信任的安全模块)机制等要求。其中很多用户受限于TPM模块的条件,在检测更新时系统提示缺少TPM,以致升级失败。 可能…

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么?2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四:图床绑定阿里云OSS 编写不易,如果我的文章对你有帮助的话,麻烦小伙伴还帮忙点个赞再走! 如果有小伙伴觉得写的啰嗦&am…

‘npm‘ 不是内部或外部命令,也不是可运行的程序

npm认识三年了,今天才知道这是node.js的命令 也就是说,想要在cmd里面运行 npm 命令,但就的安装node.js 1. node.js安装 没有安装包的先下载安装包:下载 | Node.js 中文网 (nodejs.cn) 下载之后双击打开,一路安装确…

【冥想X理工科思维】场景11:多任务并行快让我抑郁了!

冥想音频合集:职场解压冥想音频 压力场景: 我每天都面对需要同时处理多个紧急任务的压力,感觉整个人都快抑郁了,如何通过冥想来集中精力,缓解抑郁? 点击看大图: 详细说明: 接下来是…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …

离线安装vscode插件

使用vsix 1.从vscode插件市场All categories Extensions - Visual Studio Marketplace下载需要的vscode插件,拿Prettier - Code formatter插件举例 查看相应版本信息并选择适合的版本进行下载,建议选择最新版本,一般比较稳定 2.将已经下载好…

【[NOIP1999 普及组] Cantor 表】

题目描述 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 我们以 Z 字形给上表的每一项编号。第一项是 1 / 1 1/1 1/1,然后是 1 / 2 1/2 1/2, 2 / 1 2/1 2/1, 3 / 1 3/1…

如何理解Java不可变集合?有什么使用场景?

目录 1. 怎样理解不可变集合? 2. 不可变集合的应用场景 3. 不可变集合的创建和使用? 1. 怎样理解不可变集合? 温馨提示:JDK8版本中不支持不可变集合,建议升级至JDK11版本以上!!! …

FPGA时钟资源详解(4)——区域时钟资源

FPGA时钟系列文章总览:FPGA原理与结构(14)——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 二、Clock-Capable I/O 三、I/O 时钟缓冲器 —— BUFIO 3.1 I/O 时钟缓冲器 3.2 BUFIO原语 四、区域时钟…

SpringBoot+Vue前后端分离项目在Linux系统中基于Docker打包发布,并上传镜像到阿里镜像私仓

文章目录 SpringBootVue前后端分离项目在Linux系统中基于Docker打包发布,并上传镜像到阿里镜像私仓一、Java项目基于Docker打包发布1.打包应用,将打好的jar包放到我们的linux系统中2.新建dockerfile3.打包镜像4.测试运行5.上传镜像到阿里云免费私仓 二、…

物联网云组态是什么?部署物联网云组态有什么作用?

在信息化与工业化的深度融合进程中,物联网云组态以其独特的优势,正在成为企业数字化转型的重要工具。那么,物联网云组态究竟是什么呢?部署物联网云组态又能给企业带来哪些实质性的好处呢?今天,我们将围绕这…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(九): 聚酰亚胺PI薄膜的缺点有哪些

聚酰亚胺PI薄膜的缺点有哪些 聚酰亚胺(Polyimide,简称PI)薄膜是一种高性能、高温、高压、化学稳定、耐磨损、耐火、耐腐蚀的薄膜材料,具有优良的电绝缘性能、低介电常数和低介电损耗,能够有效阻止电流流动&#xff0c…

主流公链 - Solana

探索Solana区块链:下一代高性能区块链平台 1. Solana简介 Solana是一个高性能的区块链平台(TPS能达到10W级别),旨在实现高吞吐量和低延迟的区块链交易处理。它采用了一系列创新技术,其中包括Proof of History (PoH)&a…