Leetcode Hot100二刷-字符串解码

本文介绍了LeetCode394题的解码字符串问题,通过栈操作处理编码规则,重复字符,并提供了C++代码实现。解码过程涉及查找括号内的字符、提取重复次数和构建最终字符串。
摘要由CSDN通过智能技术生成

Leetcode Hot100-栈章节

394:字符串解码

链接: Leetcode394.字符串解码
类似题目:
代码随想录二刷-有效的括号
代码随想录二刷-删除字符串中的所有相邻重复项

题目需求

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”

思路

  1. 分析题干
    a. 题目给出一个特殊格式的字符串并告知了含义,也就是说看到"[ ]"时候,需要将括号里的字符重复k次,最终得到一个字符串【第一步】
    b. 类似于有效括号或删除重复项的题目,就是用栈去存元素,当遇到符合格式的元素时,就要进行特殊操作,操作完后还要压入栈中,这样才能保证最后输出结果的连贯性【第二步】
    c. 这里会遇到一个问题:当我们处理好重复字符后,它变成一个字符串了,那我还按照字符压栈会不会很耗时间?【第三步】
    d. 会的,因为这相当于重复操作,但是leetcode上可以通过【第四步】

  2. 写题顺序
    a. 创建一个栈,存储元素类型为char
    b. 遍历字符串,一个个字符进栈。当遇到“]”时,开始进行如下操作:
    i. 把字符都取出来,直到遇到“[”,把"[" pop掉
    ii. 把数字也取出来
    iii. 然后根据数字重复增加字符,构造好后压入栈中

  3. 注意事项
    a. 注意取数字的时候,一定要完整取完,次数有的超过10,那数字会占两个字符

  4. 代码

class Solution {
public:
    string decodeString(string s) {
        if (s.size() == 1) return s;
        stack<char> sta;
        sta.push(s[0]);
        for (int i = 1; i < s.size(); ++i) {
            if (s[i] == ']') {
                string temp = "";
                // 找到括号里的所有字符
                while (!sta.empty() && sta.top() != '[') {
                    temp += sta.top();
                    sta.pop();
                }
                sta.pop();
                string num = "";
                // 找到要重复的完整次数【易错】
                while(!sta.empty() && sta.top() >= '0' && sta.top() <= '9'){
                    num = sta.top() + num;
                    sta.pop();
                }
                int count = stoi(num);
                string str = temp;
                count--;
                while (count--) {
                    str += temp;
                }
                for (int i = str.size() - 1; i >= 0; --i) {
                    sta.push(str[i]);
                }
            } else {
                sta.push(s[i]);
            }
        }

        string result = "";
        while (!sta.empty()) {
            result += sta.top();
            sta.pop();
        }
        reverse(result.begin(), result.end());
        return result;
    }
};
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值