LeetCode Java刷题笔记—394. 字符串解码

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—394. 字符串解码相关的知识,希望对你有一定的参考价值。

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. 字符串解码的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 栈 - 字符串解码, leetcode 394

leetcode 394.字符串解码 Java

leetcode 394. 字符串解码 java

LeetCode 394. 字符串解码

LeetCode 394. 字符串解码

刷题394. Decode String