这道题看完了第一反应是用递归或者栈来做,第二反应是递归和栈是一回事。。。用递归写可读性高一些,所以就用递归做了。
这道题我卡了半天,因为没想出来如何让字符串的指针“实时”向前走,我一开始是设置一个for循环,用charAt()遍历字符串,这样做会导致一个很麻烦的问题:’]’ 无法处理,’]‘标志一段字母结束,所以当读到’]‘时应该返回,这时会返回至上一层,蛋疼的问题出现了,上一层的指针这时也指向这个’]’,因此上一层也直接返回了。。。这个问题的关键是没有“实时”让指针向前走,解决方案非常简单,一开始把每个字母放到一个链表里即可,每次用poll()调出字符,这样在返回上一层时就不会出现这种蛋疼的情况。
class Solution {
private StringBuilder sb = new StringBuilder();
private LinkedList<Character> queue = new LinkedList<Character>();
public String decodeString(String s) {
for(int i=0;i < s.length();i++){
queue.offer(s.charAt(i));
}
String ret = addString(queue).toString();
return ret;
}
public StringBuilder addString(LinkedList<Character> queue){
StringBuilder sb1 = new StringBuilder();
while(!queue.isEmpty()){
char charct = queue.poll();
if(Character.isDigit(charct)){
int count = Character.getNumericValue(charct);
while(Character.isDigit(queue.peek())){
char num = queue.poll();
count = 10 * count + Character.getNumericValue(num);
}
StringBuilder temp = addString(queue);
for(int k=0; k < count;k++){
sb1.append(temp);
}
}else if(charct == ']'){
return sb1;
}else if(!Character.isDigit(charct) && charct != '['){
sb1.append(charct);
}
}
return sb1;
}
}