20190806:字符串解密

字符串解密

力扣简单习题:
在这里插入图片描述

大致思路

当遇到数字时,将数字直接入数字栈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"));
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值