Leetcode:NO.394 字符串解码

题目

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

链接:https://leetcode-cn.com/problems/decode-string

解题记录

  • 逻辑很简单,通过递归求解,但是需要注意的细节比较多
  • 通过以个全局变量i,空值便利所有字符
  • 每一个递归函数中要有一个num变量,一个str变量,num就是该函数中str需要循环的次数,str就是中括号中的字符串
  • 这里设定递归函数返回的是[]号中的字符串,如果[]号中右其他[]继续递归
  • 进入递归判断为出现[,跳出递归判断为出现],这里一定要注意i的控制
  • 还要注意,num-- 后是否重新为0,我最开始写的逻辑num最后为 -1,排查了好长时间才发现问题
/**
 * @author ffzs
 * @describe 394. 字符串解码
 *
 * 给定一个经过编码的字符串,返回它解码后的字符串。
 *
 * 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 *
 * 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
 *
 * 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
 *
 * 示例:
 *
 * s = "3[a]2[bc]", 返回 "aaabcbc".
 * s = "3[a2[c]]", 返回 "accaccacc".
 * s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
 *
 * @date 2020/5/28
 */
public class Solution {
    static int i = 0;
    public static String decodeString(String s) {
        return unzip(s).toString();
    }
    private static StringBuilder unzip (String s) {
        // 递归
        int num = 0;
        StringBuilder str = new StringBuilder();

        while (i < s.length()) {
            if (s.charAt(i) == ']') {
                return str;
            }
            else if (s.charAt(i) == '[') {
                i++;
                StringBuilder sub = unzip(s);
                do {str.append(sub);} while (--num > 0);
            }
            else if (Character.isDigit(s.charAt(i))) {
                num = num*10 + s.charAt(i) - '0';
            }
            else str.append(s.charAt(i));
            i++;
        }
        return str;
    }

    public static void main(String[] args) {
        String s = "3[a]2[b4[F]c]";
        System.out.println(decodeString(s));
        System.out.println(i);
    }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章