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

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep