题目
题解
如果没有括号嵌套的情况发生,那这道题是很简单的,大不了一个个判断就行了,麻烦的就是这个括号嵌套,比如2[a2[bc]]
这道题可以用栈解决,如果当前字符为
- 数字:解析出数字(字符转数字),并进栈
- 字母或者左括号:进栈
- 右括号:开始出栈->左括号出栈->出栈序列反转拼接成字符串->取栈顶数字(即之前字符串出现的次数)->组成新的字符串
这里可以利用不定长数组来模拟栈
class Solution {
int i=0;
public String decodeString(String s) {
int n=s.length();
StringBuffer res=new StringBuffer();//结果字符串
LinkedList<String>stack=new LinkedList<>();
while(i<n){
char ch=s.charAt(i);
//字母,入栈
if(Character.isLetter(ch)||ch=='['){
stack.addLast(String.valueOf(ch));
i++;
}
//数字,入栈
else if(Character.isDigit(ch)){
stack.addLast(getDigit(s));
}
//右括号
else{
i++;
LinkedList<String>letters=new LinkedList<String>();//存字母串
while(!"[".equals(stack.peekLast()))
letters.addLast(stack.removeLast());
Collections.reverse(letters);//出栈序列反转
//左括号出栈
stack.removeLast();
//根据次数和字符串生成新的字符串
int mul=Integer.parseInt(stack.removeLast());
String str=getString(letters);//字符数组->字符串
StringBuffer sub=new StringBuffer();
for(int j=0;j<mul;j++)
sub.append(str);
stack.addLast(sub.toString());//新字符串入栈
}
}
return getString(stack);
}
//从字符串s中获取数字
public String getDigit(String s){
StringBuffer digit=new StringBuffer();
while(Character.isDigit(s.charAt(i)))
digit.append(s.charAt(i++));
return digit.toString();
}
//数组拼接得到字符串
public String getString(LinkedList<String>letters){
StringBuffer sb=new StringBuffer();
for(String letter:letters)
sb.append(letter);
return sb.toString();
}
}
时间复杂度: O ( S + n ) O(S+n) O(S+n),记解码后得出的字符串长度为S,原字符串s的长度为n,遍历一遍s时间复杂度为O(n),解码后字符入栈拼接进答案时间复杂度为O(S)。
空间复杂度: O ( S ) O(S) O(S),栈的空间。
p.s 这道题真的有点麻烦,辅助空间很多,要写的简洁还挺难的,各种api都得掌握的非常好才能解的很顺利[叹气]