字符串解密
力扣简单习题:
大致思路
当遇到数字时,将数字直接入数字栈num,当遇到左边括号时,则先判断数字栈是否为空,若为空,则直接进入下一个字符的遍历,若不为空,则将该字符压入字符串栈,并将num数字栈清空,若为右括号,则将num栈栈顶数字弹出即为value,再将字符串栈中的栈顶元素出栈,并且重复value次,再入栈list。如果为字母,则直接跟到刚刚的list后面即可。
代码实现
package com.immunize.leetcode.decode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 实现字符串解码
*
* @author Mr IMMUNIZE
*
*/
public class Decode {
public String decodeString(String s) {
// 实现一个Exp泛型的stack
Stack<Exp> stack = new Stack<>();
// num类型的stack用来存放数字
Exp e = new Exp(1);
stack.push(e);
// num为空
String num = "";
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
// 获取当前遍历的字符
char c = s.charAt(i);
// 若为数字,则将其赋值给num,转化为字符串的num
if (c >= '0' && c <= '9') {
num = num + c;
}
// 如果为左边括号,且此时num中没有数字,则进入下一轮循环
else if (c == '[') {
if (num.length() == 0)
continue;
// 如果为左边括号,但数字栈不为空,则将该数字变为int型整数value
int value = Integer.parseInt(num);
// 再将num数字栈清空
num = "";
// 将这个num的数字变为count,用于拼接字符串的次数
Exp exp = new Exp(value);
// 将该类型的exp入栈
stack.push(exp);
}
// 右括号的话,则直接出栈栈顶元素赋值为top
else if (c == ']') {
// 若为右括号,则将该字符串重复num次,也就是top,添加到list后面即可
Exp top = stack.pop();
stack.peek().list.add(top);
}
// 如果不是括号,则直接将字符添加到list即可。
else {
stack.peek().list.add(new Exp(c));
}
}
// 获得最终的字符串
Exp root = stack.pop();
return root.getStr();
}
}
// 该泛型用于简化代码
class Exp {
int count;
List<Exp> list;
char c;
public Exp(int num) {
count = num;
list = new ArrayList<>();
}
public Exp(char ch) {
c = ch;
}
// 进行字符串的拼接,并返回拼接后的字符串
public String getStr() {
String result = "";
if (list != null) {
for (int i = 0; i < count; i++) {
for (Exp e : list) {
result += e.getStr();
}
}
} else {
result += c;
}
return result;
}
}
-----------------------------------------------------------------------------
package com.immunize.leetcode.decode;
/**
* 测试
*
* @author Mr IMMUNIZE
*
*/
public class DecodeTest {
public static void main(String[] args) {
Decode d = new Decode();
// aaabcbc
System.out.println(d.decodeString("3[a]2[bc]"));
// accaccacc
System.out.println(d.decodeString("3[a2[c]]"));
// abcabccdcdcdef
System.out.println(d.decodeString("2[abc]3[cd]ef"));
}
}