【剑斩OFFER】算法的暴力美学——力扣 394 题:字符串解码

一、题目描述

二、算法原理

思路:使用双栈,一个栈原来存储字符串,另外一个存储整型数字;

1)一开始,把 string 栈先放个空字符串进去,方便后面操作;

2)如果碰到纯字母(非 [ 后面的字母),就让把这些字母提取出来拼接到 string 栈栈顶元素的后面:

3)如果遍历到数字,直接入 int 栈:

4)如果遍历到 ' [ ',就把 [ 后面的字母入 string 栈:

5)如果遍历到 ' ] ',就把双栈的栈顶元素拿出来,进行重复 K 次工作,重复结束之后把这个字符串拼接到栈顶元素的后面(这也是我为什么让 string 一开始放个空串进去的原因):

最终答案:此时 string 的栈顶元素就是最终答案:

三、代码实现

cpp 复制代码
class Solution {
public:
    string decodeString(string s) {
        vector<int> int_stack;
        vector<string> char_stack(1,"");
        
        for(int i = 0; i < s.size();)
        {
            if(s[i] == '[')// "[" 后面跟字母
            {
                i++;
                string str = "";
                while(!isdigit(s[i]) && s[i] != ']' && s[i] != '[')
                {
                    str += s[i];
                    i++;
                }
                char_stack.push_back(str);
            }
            else if(isdigit(s[i]))//纯数字
            {
                int tmp = 0;
                while(isdigit(s[i]))
                {
                    tmp = tmp * 10 + (s[i] - '0');
                    i++;
                }
                int_stack.push_back(tmp);
            }
            else if(s[i] != ']')
            {
                //纯字母
                string str;
                while(i < s.size() && !isdigit(s[i]) && s[i] != ']' && s[i] != '[')
                {
                    str += s[i];
                    i++;
                }
                char_stack.back() += str;
            }
            else //  "]"
            {
                //']'
                //取双栈元素
                int k = int_stack.back();
                string str = char_stack.back();

                //出双栈元素
                int_stack.pop_back();
                char_stack.pop_back();
            
                string ret = "";
                for(int j = 0; j < k; j++) ret += str;

                char_stack.back() += ret;
                i++;
            }
        }

        return char_stack.back();
    }
};
相关推荐
小飞学编程...2 小时前
【哈希表】
数据结构·哈希算法·散列表
码匠许师傅2 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
重生之后端学习4 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing5 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
夜不会漫长6 小时前
C++入门(1)
开发语言·c++·算法
晚风醉蝶8 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光8 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..8 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留8 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci9 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化