本题主要思路是使用两个栈:一个用于存储倍数(数字),另一个用于存储解码结果(字符串)。在遍历输入字符串时,根据不同的字符执行相应的操作,最终得到解码后的字符串。
具体来说,字符有四种不同的情况:
- 如果c是 '[',表示开始一个新的子串,将当前的倍数multi压入stack_multi栈中,将当前的解码结果ans压入stack_ans栈中,然后重置multi为0,ans为一个空字符串。
- 如果c是']',表示当前子串结束,需要将当前的ans按照倍数进行重复。从stack_multi栈中取出一个倍数cur_multi,然后将ans重复cur_multi次,再与stack_ans栈中的上一个解码结果相加,得到新的解码结果。
- 如果c是数字(在'0'到'9'之间),将当前的数字字符转换为整数并更新multi。
- 如果c是其他字符,直接将其添加到当前的解码结果res中。
Java代码如下:
class Solution {public String decodeString(String s) {StringBuilder ans = new StringBuilder();int mutil = 0;LinkedList<Integer> stack_multi = new LinkedList<>();LinkedList<String> stack_ans = new LinkedList<>();for(Character c : s.toCharArray()){if(c >= '0' && c <= '9'){mutil = mutil * 10 + (c - '0');}else if(c == '['){stack_multi.addLast(mutil);stack_ans.addLast(ans.toString());mutil = 0;ans = new StringBuilder();}else if(c == ']'){int cur_mutil = stack_multi.removeLast();StringBuilder temp = new StringBuilder();for(int i=0; i<cur_mutil; i++) temp = temp.append(ans);ans = new StringBuilder(stack_ans.removeLast() + temp);}else{ans.append(c);}}return ans.toString();}
}