LeetCode-394:Decode String(字符串解码)

本文介绍如何解码遵循k[encoded_string]规则的字符串。通过遍历字符串,使用栈来处理数字和编码字符串,当遇到'['开始计数,']'时将已收集的字符串与计数值组合并解码,最终得到解码后的字符串。文章提供了Java、Python和Scala三种语言的实现代码。
摘要由CSDN通过智能技术生成

Given an encoded string, return its decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.

Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won’t be input like 3a or 2[4].

Examples:

 s = "3[a]2[bc]", return "aaabcbc".
 s = "3[a2[c]]", return "accaccacc".
 s = "2[abc]3[cd]ef", return "abcabccdcdcdef".

思路

本题要求很简单,就是按要求给字符串解码,编码规则为k[encoded_string],k为一个数字,表示encoded_string出现的次数,解码规则即为将 k[encoded_string] 转化为 kencoded_string 的拼接,题目所给的字符没有空格,并且编码串中不会存在数字。
这里可以使用栈这种数据结构来处理,步骤如下:

  1. 遍历字符串中的所有元素;
  2. 当遍历字符非数字和右括号“]”时,全部进行入栈操作;
  3. 当遍历的字符是数字时,需要继续遍历,直到找到所有连续的数字字符,并将其拼接为一个数字字符串,然后入栈;
  4. 当遍历到“]”字符时,开始出栈操作,直到遇到“[”字符后终止,此时除“[”字符外的其他所有出栈字符按序拼接后可得到encoded_string 的逆序串,并且此时栈顶的元素一定是编码串出现的次数 k ;
  5. 得到encoded_stringk 后,将其进行解码,并将解码串入栈;
  6. 进行如上步骤遍历完全部元素后,此时将栈中元素依次出栈,即可得到目标解码串的逆序串,此时只需将逆序串反序输出即可。

Java实现

class Solution {
   
    public String decodeString(String s) {
   
        Stack<String> res = new Stack<>();
        // 存储数字k
        StringBuffer k = new StringBuffer();
        // 数字k拼接完成标志
        boolean flag = false;

        for (char c : s.toCharArray()) {
   
            // 如果是数字字符,则开始构建编码次数k
            if (c >= '0' && c <= '9') {
   
                flag = true;
                k.append(c);
                continue;
            }
            // 将拼好的数字k入栈,并置空k
            if (flag) {
   
                res.push(k.toString());
                k = new StringBuffer()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值