【LeetCode:394. 字符串解码 + 栈 | 递归】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |


🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 栈 | 递归](#⚡ 栈 | 递归)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"

输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"

输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"

输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"

输出:"abccdcdcdxyz"

提示:

1 <= s.length <= 30

s 由小写英文字母、数字和方括号 '[]' 组成

s 保证是一个 有效 的输入。

s 中所有整数的取值范围为 [1, 300]

🌟 求解思路&实现代码&运行结果


⚡ 栈 | 递归

🥦 求解思路
  1. 从左向右解析字符串:如果当前位置是字母位,那么我们直接解析当前这个字母,然后递归向下解析这个字母后面的内容。如果当前位置为数字位,那么后面一定包含一个用方括号表示的字符串;
  2. 可以先解析出一个数字,然后解析到了左括号,递归向下解析后面的内容,遇到对应的右括号就返回,此时我们可以根据解析出的数字num解析出的括号里的字符串 s 构造出一个新的字符串,即num个s拼接;
  3. 当前字符串解析结束后,再次调用递归函数,解析右括号右边的内容;
  4. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
java 复制代码
class Solution {
    public static String decodeString(String s) {
		char[] str = s.toCharArray();
		return process(str, 0).ans;
	}

	public static class Info {
		public String ans;
		public int end;

		public Info(String a, int e) {
			ans = a;
			end = e;
		}
	}

	public static Info process(char[] s, int i) {
		StringBuilder ans = new StringBuilder();
		int times = 0;
		while (i < s.length && s[i] != ']') {
			if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {
				ans.append(s[i++]);
			} else if (s[i] >= '0' && s[i] <= '9') {
				times = times * 10 + s[i++] - '0';
			} else { // str[index] = '['
				Info next = process(s, i + 1);
				ans.append(timesString(times, next.ans));
				times = 0;
				i = next.end + 1;
			}
		}
		return new Info(ans.toString(), i);
	}

	public static String timesString(int times, String str) {
		StringBuilder ans = new StringBuilder();
		for (int i = 0; i < times; i++) {
			ans.append(str);
		}
		return ans.toString();
	}

}
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
skywalk8163几秒前
Clojure学习:运行在 Java 虚拟机(JVM)上的动态Lisp编程语言
java·lisp·clojure
一碗谦谦粉5 分钟前
Spring之spring的单例bean是线程安全的吗
java·spring
liuliuliuliuyujie6 分钟前
学生管理系统
java
ItKevin爱java9 分钟前
java八股文面试题
java·开发语言
喜欢猪猪21 分钟前
两个线程之间是如何通信的呢?
java·开发语言
co松柏25 分钟前
在非 antd pro 项目中使用 umi OpenAPI
java·前端
java66666888826 分钟前
Spring Boot中的数据加密与解密
java·spring boot·后端
-代号952726 分钟前
【LeetCode】十、二分查找法:寻找峰值 + 二维矩阵的搜索
算法·leetcode·矩阵
NightHacker37 分钟前
什么是AOP思想?
java·开发语言
番茄炒西红柿炒蛋42 分钟前
秋招Java后端开发冲刺——非关系型数据库篇(MongoDB)
java·mongodb·nosql