题目描述:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.
虽然分类是属于深度,但是我用栈实现了,比较冗余
class Solution {
public String decodeString(String s) {
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
char[] schar = s.toCharArray();
for (int i = 0; i < schar.length; i++) {
char tem = schar[i];
if(tem == '['){
stack.push(tem);
}else if (tem == ']') {
StringBuilder sbappend = new StringBuilder();
StringBuilder timeBuilder = new StringBuilder();
while (!stack.isEmpty() && stack.peek() != '[') {
sbappend.append(stack.pop());
}
sbappend.reverse();
if(stack.isEmpty()){
char get[] = new String(sbappend).toCharArray();
for (int j = 0; j < get.length; j++) {
stack.push(get[j]);
}
}else {
// 弹出[
stack.pop();
while (!stack.isEmpty() && stack.peek() <= '9' && stack.peek() >= '0') {
timeBuilder.append(stack.pop());
}
timeBuilder.reverse();
int temtime = Integer.valueOf(new String(timeBuilder));
int x = 0;
while (x ++ < temtime) {
char get[] = new String(sbappend).toCharArray();
for (int j = 0; j < get.length; j++) {
stack.push(get[j]);
}
}
}
}else {
// 是字母直接放入
stack.push(tem);
}
}
StringBuilder sBuilder = new StringBuilder();
while (!stack.isEmpty()) {
sBuilder.append(stack.pop());
}
return sBuilder.reverse().toString();
}
}
排名靠前的代码
实现的是真的好!
class Solution {
public String decodeString(String s) {
StringBuilder res=new StringBuilder();
Stack<Integer> numstack=new Stack<>();
Stack<String> stringstack=new Stack<>();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==']'){
String str=stringstack.pop();
int count=numstack.pop();
String newstr=repeatstr(count,str);
if(!numstack.isEmpty()){
StringBuilder tmp=new StringBuilder();
tmp.append(stringstack.peek());
tmp.append(newstr);
i++;
while(s.charAt(i)!=']'&&!(s.charAt(i)>='0'&&s.charAt(i)<='9')){
tmp.append(s.charAt(i));
i++;
}
i--;
stringstack.set(stringstack.size()-1,tmp.toString());
}else{
res.append(newstr);
}
}else{
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
int m=i;
while(s.charAt(i)>='0'&&s.charAt(i)<='9'){
i++;
}
numstack.push(Integer.valueOf(s.substring(m,i)));
i++;
m=i;
while(s.charAt(i)!=']'&&!(s.charAt(i)>='0'&&s.charAt(i)<='9')){
i++;
}
stringstack.push(s.substring(m,i));
i--;
}else{
if(numstack.isEmpty()){
res.append(s.charAt(i));
}
}
}
}
return res.toString();
}
public String repeatstr(int num,String s){
if(num<=0) return "";
StringBuilder sb=new StringBuilder();
for(int i=0;i<num;i++){
sb.append(s);
}
return sb.toString();
}
}