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

  1. 字符串解码

中等

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

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

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

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

示例 1:

输入:s = "3a2bc"

输出:"aaabcbc"

示例 2:

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

输出:"accaccacc"

示例 3:

输入:s = "2abc3cdef"

输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3cdxyz"

输出:"abccdcdcdxyz"

分析:

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

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

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

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

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

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

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

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

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

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

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

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

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

程序如下:

python 复制代码
#函数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=abc3a2dxy

子字符串起始和结束位置索引号: 0, 3, 7, 11, 13

子字符串列表: 'abc', '3\[a', '2d', 'xy']

解码之后的字符串: abcaaaddxy

运行实例2

pls input s=3a2\[bc3b]

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

子字符串列表: '3\[a2\[bc3b]']

子字符串起始和结束位置索引号: 0, 1, 6, 10, 11, 16, 20, 21, 26, 30

子字符串列表: 'a', '2\[bc', '3b', 'a', '2bc', '3b', 'a', '2bc', '3b']

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

子字符串列表: 'abcbcbbbabcbcbbbabcbcbbb'

解码之后的字符串: abcbcbbbabcbcbbbabcbcbbb

运行实例3

pls input s=3ab2\[c3bcac]

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

子字符串列表: '3\[ab2\[c3bcac]']

子字符串起始和结束位置索引号: 0, 2, 6, 11, 15, 19, 24, 28, 32, 37, 39

子字符串列表: 'ab', '2\[c', '3bc', 'acab', '2c', '3bc', 'acab', '2c', '3bc', 'ac']

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

子字符串列表: 'abccbcbcbcacabccbcbcbcacabccbcbcbcac'

解码之后的字符串: abccbcbcbcacabccbcbcbcacabccbcbcbcac

运行实例4

pls input s=efg

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

子字符串列表: 'efg'

解码之后的字符串: efg

运行实例5

pls input s=32\[ab2\[b2c]]

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

子字符串列表: '3\[2\[ab2\[b2c]]']

子字符串起始和结束位置索引号: 0, 13, 26, 39

子字符串列表: '2\[ab2\[b2c]', '2ab2\[b2c]', '2ab2\[b2c]']

子字符串起始和结束位置索引号: 0, 2, 6, 10, 12, 16, 20, 22, 26, 30, 32, 36, 40, 42, 46, 50, 52, 56, 60

子字符串列表: 'ab', '2\[b', '2c', 'ab', '2b', '2c', 'ab', '2b', '2c', 'ab', '2b', '2c', 'ab', '2b', '2c', 'ab', '2b', '2c']

解码之后的字符串: abbbccabbbccabbbccabbbccabbbccabbbcc

感悟:

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

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

相关推荐
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
战族狼魂1 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
weixin_408099671 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
李剑一1 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH1 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
去码头整点薯条ing2 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
香辣牛肉饭3 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
赶紧写完去睡觉3 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀3 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp