题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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".
双栈解法:
class Solution {
public String decodeString(String s) {
if (s.length() == 0)
return "";
char[] chars = s.toCharArray();
StringBuffer sb = new StringBuffer();
Stack<Character> charStack = new Stack<>();
Stack<Integer> countStack = new Stack<>();
String curNum = "";
for (char c : chars){
if (c >= '0' && c <= '9'){
//数字
curNum += c;
}else if (c =='['){
//左括号
//遇到左括号前肯定有数字
charStack.push('[');
countStack.push(Integer.parseInt(curNum));
//清空当前数字
curNum = "";
}else if(c == ']'){
//右括号
//出栈,直到弹出[为止
StringBuffer tmpSb= new StringBuffer();
char tmp = charStack.pop();
while(tmp != '['){
tmpSb.append(tmp);
tmp = charStack.pop();
}
//两个括号之间的字符串
String str = tmpSb.reverse().toString();
//需要重复的次数
Integer count = countStack.pop();
StringBuffer newSb = new StringBuffer();
while(count != 0){
newSb.append(str);
count--;
}
str = newSb.toString();
//判断字符栈中是否为空,不为空就将当前字符串压栈,为空就追加到结果
if (charStack.isEmpty()){
sb.append(str);
}else{
for (char tmpC : str.toCharArray()){
charStack.push(tmpC);
}
}
}else{
//普通字符
//如果当前字符栈不为空,就压栈,否则直接追加到结果
if (charStack.isEmpty()){
sb.append(c);
}else{
charStack.push(c);
}
}
}
return sb.toString();
}
}
网友评论