需求:给定一个经过编码的字符串,要求返回它的解码后的字符串。
编码规则是:k[str],这个编码的含义是str出现了k次,k是一个正整数。
具体例子:
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
网络配图
Java中的解决方法,解决这个问题的关键是要将字符串转换为一个结构化的数据结构和递归形式来返回字符串。
实例代码如下:
class Node{
int num;
ArrayList list;
char symbol;
boolean isList;
public Node(char s){
symbol=s;
}
public Node(int n){
list = new ArrayList();
isList=true;
num=n;
}
public String toString(){
String s = "";
if(isList){
s += num + ":" + list.toString();
}else{
s += symbol;
}
return s;
}
}
public class Solution {
public String decodeString(String s) {
int i = 0;
Stack stack = new Stack();
stack.push(new Node(1));
String t = "";
while (i < s.length()) {
char c = s.charAt(i);
// new Node
if (c >= '0' && c
t += c;
} else if (c == '[') {
if (t.length() > 0) {
int num = Integer.parseInt(t);
stack.push(new Node(num));
t = "";
}
} else if (c == ']') {
Node top = stack.pop();
if (stack.isEmpty()) {
} else {
stack.peek().list.add(top);
}
} else {
stack.peek().list.add(new Node(c));
}
i++;
}
return getString(stack.peek());
}
public String getString(Node node){
String s="";
if(node.isList){
for(int i=0; i
for(Node t: node.list)
s+= getString(t);
}
}else{
s+=node.symbol;
}
return s;
}
}
这不是唯一的方法,如果你有更好的方法,可以分享出来,大家一起学习一下。
领取专属 10元无门槛券
私享最新 技术干货