LeetCode Java刷题笔记—394. 字符串解码
Posted 刘Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—394. 字符串解码相关的知识,希望对你有一定的参考价值。
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数,并且支持嵌套编码。原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
例如,输入:s = “3[a2[c]]”,输出:“accaccacc”。
中等难度的题,但实际上我们借助栈结构就可以比较简单的写出来。最简单的方法是使用两个变量保存当前的数字和字符串,然后使用两个辅助栈,数字存放在数字栈,字符串存放在字符串栈。
遇到左括号的时候,括号之前的数字和字符串分别入栈,然后对括号内的字符继续重新统计,遇到右括号时候弹出前一个数字和字符串,然后与当前的字符串进行拼接。
可以知道,如果存在嵌套,那么最后入栈的数据最先出栈,也就是最内层的字符串先被解码。
public String decodeString( String s )
//存放当前的字符串
StringBuilder str = new StringBuilder();
//存放当前数字
int num = 0;
//数字栈
Stack<Integer> nums = new Stack<>();
//字符串栈
Stack<StringBuilder> strs = new Stack<>();
for( char c : s.toCharArray() )
//如果遇到 [ ,那么之前的数字和字符串都入栈,然后重新开始统计
if( c == '[' )
//数字和字符串入栈
nums.push( num );
strs.push( str );
//重新开始统计
num = 0;
str = new StringBuilder();
//如果遇到 ] ,那么栈里面的数字和字符串都出栈,并且与括号内的字符串进行拼接
else if( c == ']' )
//之前的数字和字符串都出栈
int prenum = nums.pop();
StringBuilder prestr = strs.pop();
//拼接字符串,可能需要进行多次拼接
for( int i = 0; i < prenum; i++ )
prestr.append( str );
//赋给str
str = prestr;
//遇到了数字,那么拼接数字
else if( c >= '0' && c <= '9' )
//因为数字可能不只是个位数,因此需要计算真实的值
num = num * 10 + Integer.parseInt( String.valueOf( c ) );
else
//其他,当作普通字符拼接,作为当前字符串
str.append( c );
return str.toString();
以上是关于LeetCode Java刷题笔记—394. 字符串解码的主要内容,如果未能解决你的问题,请参考以下文章