題目
給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: 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);
}
}