原题地址:https://leetcode-cn.com/problems/decode-string/
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 :
输入:s = “3[a]2[bc]”
输出:“aaabcbc”
思路:数字入栈1,除了右括号之外的字符入栈2,遇到右括号则匹配栈2中的右括号,将匹配期间出栈的字符重复n(栈1栈顶数字)次。
class Solution {
public String decodeString(String s) {
char[] char_s = s.toCharArray();
Stack<Integer> num = new Stack<>();
Stack<String> str = new Stack<>();
StringBuffer total = new StringBuffer();
int l = s.length();
for(int I=0;I<l;I++){
char i=char_s[I];
int x=0;
if(Character.isDigit(i)){
while(Character.isDigit(char_s[I+x])) x++;
String num_string = s.substring(I,I+x);
num.push(Integer.valueOf(num_string).intValue());
I = I+x-1;
continue;
}
if(i!=']') str.push(Character.toString(i));
else if(i==']'){
int n = num.pop();
LinkedList<String> str_tmp_i = new LinkedList<>();
StringBuffer str_tmp = new StringBuffer();
while((!str.isEmpty())&&(!str.peek().equals("["))){
str_tmp_i.addFirst(str.pop());//字符串后入先出,添加到首位
}
str.pop();//“[”出栈
for(int m=1;m<=n;m++){
for(String item:str_tmp_i) str_tmp.append(item);
}
if(str.isEmpty()) str.push(str_tmp.toString());
else {
if(!str.peek().equals("["))str.push(str.pop().concat(str_tmp.toString())); //不与“[”合并
else str.push(str_tmp.toString());
} //已解码的字符串入栈
}
}
while(!str.isEmpty()) total.insert(0,str.pop());
return total.toString();
}
}
青古の每篇一歌
《杂念》
愉快乐观努力顽强
然而杂念却未忘掉