题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”.
应用到了栈的思想
package LeetCode;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 100[leetcode]
*
* 3[z]2[2[y]pq4[2[jk]e1[f]]]ef
*/
public class DT394 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.next();
ArrayList<String> list = new ArrayList<>();
for(int i = 0; i < str.length(); i++) {
if(!str.substring(i,i+1).equals("]")) {
list.add(str.substring(i,i+1));
} else {
int right = list.size() - 1;
int left = right;
while(!list.get(left).equals("[")) {
left --;
}
int l = left - 1;
while(l >= 0 &&list.get(l).compareTo("a") < 0 &&list.get(l).compareTo("[") != 0 && Integer.valueOf(list.get(l)) >= 0 && Integer.valueOf(list.get(l)) <= 9){
l--;
}
String res = functionDemo(l,left,right,list);
list.add(res);
}
}
for(String s : list) {
System.out.print(s);
}
}
private static String functionDemo(int l, int left, int right, ArrayList<String> list) {
String s = "";
for(int i = l + 1; i < left; i ++) {
s += list.get(i);
}
int n = Integer.valueOf(s);
s = "";
for(int i = left + 1; i <= right; i++) {
s += list.get(i);
}
String str = "";
for(int i = 1 ; i <= n; i++) {
str += s;
}
for(int i = l + 1; i <= right; i++) {
list.remove(list.size() - 1);
}
return str;
}
}