解码题。
编码规则直接看例子(编码后字符串->原字符串):
2[b] -> bb
3[a2[c]] -> 3[acc] -> accaccacc
2[a2[b]ef]xy ->2[abbef]xy->abbefabbefxy
根据上面的结构我们很容易想到用深搜算法:
先将']' 之前的信息(要重复的部分及重复次数)压到stack里,等到了']'再一个一个推出还原。思路非常清晰,但是实现起来并不简单。得注意细节及其处理方式,比如数字可能出现两位及以上; 并列关系[],[]和包含关系[[]]如何巧妙区分。另外发现大循环用while而不是for可能更方便一些。
下面是我在leetcode论坛上找到的比较好看的代码(44%):
public static String decodeString(String s) {
Stack<Integer> count = new Stack<>();
Stack<String> result = new Stack<>();//用Stack处理包含关系
result.push("");
int i = 0;
while(i<s.length()){
char a = s.charAt(i);
if(a >= '0' && a <= '9'){
int p1 = i;
while(Character.isDigit(s.charAt(i+1))) i++;
count.push(Integer.parseInt(s.substring(p1,i+1)));
} else if (a == '[') {
result.push("");//用初始化空字符串处理并列关系
} else if(a == ']') {
String temp = new String(result.pop());
StringBuilder sb = new StringBuilder();
int nloop = count.pop();
for(int j = 0; j < nloop;j++)
sb.append(temp);
result.push(result.pop()+sb.toString());
} else {
result.push(result.pop()+a);
}
i++;
}
return result.pop();
}
当然也可以用递归算法,但我感觉比较难想,这种算法比较直接,面试的时候想到比较实际。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。