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.,字符串解码)