首页 > 其他分享 >394. 字符串解码

394. 字符串解码

时间:2023-01-10 00:33:06浏览次数:47  
标签:right return idx 解码 num 394 字符串 self left

问题链接

https://leetcode.cn/problems/decode-string/description/

解题思路

这题一看就是个典型的递归题目,典型的递归函数的定义就是递归函数的解。

我们首先定义递归函数的参数和返回值。

递归函数的参数显然就是一个字符串,递归函数的返回值是经过计算的字符串。

我们按照递归的一般思路对这个题目进行分析。

我们看看本层需要处理什么。

这个题目,有缩小规模潜质的字符串,显然是上一层中某个被包裹在中括号中的片段。

也就是说,我们如果用一个下标来计数,我们可能在本层的字符串中遇到数字(不一定是个位数) 也有可能遇到边界符号,也有可能遇到正常的英文字符。

三者出现的顺序也有讲究,数字绝对会出现在边界符号之前,并且紧挨着。

如果是遇到数字的话,那可以先把数字提取出来,然后将其之后的有缩小规模潜质的字符串交给下一层递归进行运算。

最后我们看递归的退出条件。

当遍历完本层之后,自然退出即可。

代码

class Solution:
    def decodeString(self, s: str) -> str:
        idx, length = 0, len(s)
        res = ''
        while idx < length:
            if self.is_num(s[idx]):
                n_left, n_right = idx, self.get_num_right_idx(s, idx)
                num = self.st2i(s[n_left: n_right+1])
                nxt_left_idx = n_right + 1
                nxt_right_idx = self.get_right_idx(s, nxt_left_idx)
                res += num * self.decodeString(s[nxt_left_idx+1: nxt_right_idx])
                idx = nxt_right_idx + 1
            else:
                res += s[idx]
                idx += 1
        return res

    def is_num(self, n):
        if n in '0123456789':
            return True
        return False

    def st2i(self, n):
        return int(n)

    def get_num_right_idx(self, n, left_idx):
        for i in range(left_idx, len(n)):
            if not self.is_num(n[i]):
                return i-1
    def get_right_idx(self, n, left_idx):
        cnt = 0
        for i in range(left_idx, len(n)):
            if n[i] == '[':
                cnt += 1
            if n[i] == ']':
                cnt -= 1
            if cnt == 0:
                return i

 

标签:right,return,idx,解码,num,394,字符串,self,left
From: https://www.cnblogs.com/bjfu-vth/p/17038946.html

相关文章

  • 非数据类型变量:列表和字符串
    目录:一.列表1.列表的定义(1)空列表(2)索引2.list的操作方法(1)下标操作索引->值:列表[索引]值->索引:列表.index(值)(2)增加数据列表.append(数据)列表.insert(索引,数据)列表.ex......
  • 字符串函数(day21)
    strcpy函数char*strcpy(char*dst,constchar*src){if((dst==NULL)||(src==NULL))returnNULL;//如果有空指针存在,返回空指针char*ret=dst;//【1】设......
  • HDU-3949 XOR 题解报告
    题目地址题意:从一个序列中取任意个元素进行异或,求能异或出的所有数字中的第k小。分析:性质:一个线性基异或上另一个不同的线性基,并作为自己的新值,这并不改变整个线性......
  • 003 python一个整数或byte数据转为十六进制字符串不带0x
    把一个byte数据转化为字符,例如byte数据为05,要转换为十六进制字符串hexstr,不带0xd=5hs=((str(hex(d)))[2:]).zfill(2)如上,hs为转换后的字符串。原理就是先用hex转化......
  • 刷刷刷Day8| 剑指 Offer 58 - II. 左旋转字符串
    剑指Offer58-II.左旋转字符串LeetCode题目要求字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比......
  • Redis 数据结构-简单动态字符串
    Redis数据结构-简单动态字符串 无边落木萧萧下,不尽长江滚滚来。 1、简介Redis之所以快主要得益于它的数据结构、操作内存数据库、单线程和多路I/O......
  • [H264编解码] 第一章 NAL Unit 解析部分
    包装类型:AnnexB和avcCAnnexBAnnexB格式的原理非常简单,就是在一个NALU前面加上三个或者四个字节,这些字节的内容是0001或者001。当我们读取一个H264流的时......
  • 16进制转换为字符串---JS
    <html><body><scripttype="text/javascript">functionmyFunction(){varx=document.getElementById("fname"); varfile=document.getElementBy......
  • 刷刷刷Day8| 151. 反转字符串中的单词
    151.反转字符串中的单词LeetCode题目要求给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词......
  • P7114 [NOIP2020] 字符串匹配 解题报告
    ~~NOIP的蓝题果然还是好难啊啊啊啊~~前言:作为一道NOIP的真题,这道题放在T2难度并不是特别大,不过考点还是比较偏的,扩展KMP和树状数组的组合,并且还带有一定的思维难度,......