力扣HOT100之栈:394. 字符串解码

这道题又是栈的经典应用,之前拼多多笔试遇到过类似的题目。这回碰到了依旧不会,看完华南溜达虎的视频以后才做出来,感觉这个题目还挺高频的,这次好好记录一下思路。

我们主要使用到一个存储字符串变量的栈stack<string> st,用一个for循环来遍历字符串s中的所有的字符,如果当前字符不是],则持续将当前遍历到的字符添加到st中(由于字符是无法添加到存储字符串的栈中的,因此这里需要将单个字符转换为字符串再压入栈中),如果遇到了],则我们需要进行进一步的处理,首先,题目保证所有的输入都是合法的 ,因此我们可以断定,在遍历到]之前,st中已经存储了与之匹配的[,我们先将[之后加入的字母全都弹出,并用一个字符串temp接收,在接收完毕后,此时栈顶元素一定为[,我们将其弹出,接下来就是数字部分,注意,字符串中的数字可能不止一位,可能会出现11[a12[c]]这种状况,所以我们需要持续地对栈顶元素进行判断,通过调用C++的isdigit函数来判断当前遍历到的字符串是否为数字字符,同样,我们也用一个字符串变量num来接收所有的数字,拼接成正确的形式,然后我们直接调用stoi()将num转换成对应的整形变量,在得到了重复次数num和需要重复的字符串temp后,我们直接使用一个while循环将temp重复num次,然后将其再次压入栈中。

注意,以上的操作是针对字符串中出现[和]的情形,我们需要将形如x[str]的形式将其转换成strstrstr...的形式,因此我们需要将栈中对应的中括号和数字弹出并正确处理后,将其压入栈中,以便于后续最终结果的拼接。

在遍历完所有字符后,我们将st中的字符串拼接起来即可。

cpp 复制代码
class Solution {
public:
    string decodeString(string s) {
        string result;
        stack<string> st;
        for(char c : s){
            if(c != ']'){   //只要没遇到']'就一直压入栈中
                string temp;
                temp += c;
                st.push(temp);
            }
            else{
                string temp;
                while(st.top() != "["){
                    temp = st.top() + temp;
                    st.pop();
                }
                st.pop();   //弹出[
                string num;
                while(!st.empty() && isdigit(st.top()[0])){  //记录重复次数
                    num = st.top()[0] + num;
                    st.pop();
                } 
                int count = stoi(num);
                string str;
                while(count > 0){
                    str += temp;
                    count--;
                }
                st.push(str);
            }
        }
        while(!st.empty()){
            result = st.top() + result;
            st.pop();
        }
        return result;
    }
};
相关推荐
jyOverQ29 分钟前
从零学 JVM(七):垃圾收集器详解——Serial、ParNew、Parallel、CMS 与 G1
java·jvm
liangbo737 分钟前
Spring系列11:切点表达式
java·spring
3095566661 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
nice_lcj5201 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
文丑颜不良啊1 小时前
LeetCode2861~2880题目解析
java·leetcode
装不满的克莱因瓶1 小时前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime2 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
qq_406981032 小时前
c++ lamda(三)Lambda表达式
java·前端·c++