欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【C++算法】68.栈_字符串解码

【C++算法】68.栈_字符串解码

2025/5/21 6:29:49 来源:https://blog.csdn.net/hlyd520/article/details/148097653  浏览:    关键词:【C++算法】68.栈_字符串解码

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

394. 字符串解码


题目描述:

d1f0c4251a355db4bbbb428a2c1652e5


解法

用栈来模拟。

两个栈,一个放字符串一个放数字。

d9766f5eb90ca65f61fe3416c7d46fb1

4866624b243a43945d3e3e0c8f542a59

51652a5e624baae8855af29897d0f83e

然后就遇到第一个右括号了,把两个栈的栈顶拿出来,

1b9b3d402aa47fa7f7a9141b02d564d4

接着把bcbc放到原来栈顶元素的后面

88f5aadd50c238b34616447f2cfb4837

然后把abcbc拿出来,就变成空串了,所以有个细节就是字符串的栈里面要先放入一个空串。

接下来遇到de,就直接放到栈顶元素的后面,因为没有右括号就不需要重复。

继续执行,最后弹出string的栈顶元素。


C++ 算法代码:

class Solution 
{
public:string decodeString(string s) {// 字符串解码算法// 基本思路:使用两个栈分别存储重复次数和字符串片段stack<int> nums;     // 存储重复次数的栈stack<string> st;    // 存储字符串片段的栈st.push("");         // 初始化字符串栈,放入空字符串作为起始int i = 0, n = s.size();  // i是当前处理位置,n是字符串长度while(i < n){if(s[i] >= '0' && s[i] <= '9')  // 处理数字(重复次数){// 提取完整的数字int tmp = 0;while(i < n && s[i] >= '0' && s[i] <= '9'){tmp = tmp * 10 + (s[i] - '0');i++;}nums.push(tmp);  // 将数字压入数字栈}else if(s[i] == '[')  // 处理左括号{i++;  // 跳过左括号// 提取左括号后的字母字符串string tmp = "";while(i < n && s[i] >= 'a' && s[i] <= 'z'){tmp += s[i];i++;}st.push(tmp);  // 将提取的字符串压入字符串栈}else if(s[i] == ']')  // 处理右括号,表示一个编码片段结束{// 弹出当前字符串片段和对应的重复次数string tmp = st.top();st.pop();int k = nums.top();nums.pop();// 将字符串重复k次,并添加到栈顶字符串末尾while(k--){st.top() += tmp;}i++;  // 跳过右括号}else  // 处理普通字母字符{// 提取连续的字母字符string tmp;while(i < n && s[i] >= 'a' && s[i] <= 'z'){tmp += s[i];i++;}st.top() += tmp;  // 将提取的字符串添加到栈顶字符串末尾}}return st.top();  // 返回最终解码后的字符串}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com