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);
    }
}

在這裏插入圖片描述

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