LeetCode394. Decode String字符串解码

2023-10-07 21:18

本文主要是介绍LeetCode394. Decode String字符串解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

394. Decode String

题意:

Given an encoded string, return its decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.

Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4].

Example 1:

Input: s = "3[a]2[bc]"
Output: "aaabcbc"

Example 2:

Input: s = "3[a2[c]]"
Output: "accaccacc"

Example 3:

Input: s = "2[abc]3[cd]ef"
Output: "abcabccdcdcdef"

Example 4:

Input: s = "abc3[cd]xyz"
Output: "abccdcdcdxyz"

例子分析

char-》int是c-'0',注意是将谁单引号!!!!!!!!!图片中的char到int的转换是错误的。

 分析要点:

1.因为涉及到括号匹配问题,所以要用到栈(数字栈和字母栈),此时联想到四则运算中运用到栈(运算符栈和数字栈)。在此题中的数字栈就相当于四则运算中的运算符栈,因为都是根据栈中的内容的表示对对象进行某种操作。

2.题目中多次用到字符的拼接,这时候最好不要直接用str=str1+str2这种,因为底层涉及到字符串的复制,会产生多个字符串对象(str、str1、str2),所以最好是用StringBuilder。

3.因为用到StringBuilder,所以要用new分配内存,注意开头和结尾处String和StringBuider之间要进行转换。

复杂度

1.时间复杂度O(n)

2.空间复杂度O(n)

代码:

Python

class Solution:def decodeString(self, s: str) -> str:multi=0res=''multiStack=[]resStack=[]for c in s:if c.isdigit():multi=multi*10+int(c)elif c=='[':multiStack.append(multi)multi=0resStack.append(res)res=''elif c==']':cur_multi=multiStack.pop()pre_res=resStack.pop()res=pre_res+cur_multi*reselse:res=res+creturn res

 

Java

class Solution {public String decodeString(String s) {int multi=0;StringBuilder res=new StringBuilder();//存放结果//创建两个栈:数字栈和字母栈LinkedList<Integer> multiStack=new LinkedList<>();LinkedList<String> resStack=new LinkedList<>();for(char c:s.toCharArray()){if(c>='0'&&c<='9'){//当遇到的是数字multi=multi*10+(c-'0');//当数字是多位数;字符转换成数字:c-'0'}else if(c=='['){//当遇到的是左括号:数字栈和字母栈都入栈,并且将multi和res清一下multiStack.addLast(multi);multi=0;resStack.addLast(res.toString());res=new StringBuilder();   }else if(c==']'){//当遇到的是右括号,将数字栈和字母栈都出栈,构造pre_res=resStack+multiStack*res;并更新resint cur_multi=multiStack.removeLast();//栈:先进后出StringBuilder tmp=new StringBuilder();for(int i=0;i<cur_multi;++i){tmp.append(res);}res=new StringBuilder(resStack.removeLast()+tmp);}else{//当遇到的是字母res.append(c);  }}return res.toString();}
}

 

这篇关于LeetCode394. Decode String字符串解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160497

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服