当前位置: 首页 > news >正文

【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();  // 返回最终解码后的字符串}
};
http://www.xdnf.cn/news/557947.html

相关文章:

  • 关于Linux服务器数字取证一
  • pytorch小记(二十四):PyTorch 中的 `torch.full` 全面指南
  • Python 包管理工具 uv
  • RocketMQ 的事务消息是如何实现的
  • 【Java高阶面经:微服务篇】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
  • unipp === 状态管理 Pinia 使用
  • 萌新联赛第(三)场
  • 自建主机NAS
  • Java转Go日记(四十二):错误处理
  • 链表-设计链表
  • OBS Studio:windows免费开源的直播与录屏软件
  • Tractor S--二维转一维,然后最小生成树
  • Python 中 pass 语句的详解和使用
  • Java双指针法:原地移除数组元素
  • IEEE出版|2025年智能光子学与应用技术国际学术会议(IPAT2025)
  • CRC计算
  • doris数据分片逻辑
  • RFID技术在半导体晶圆卡塞盒中的应用方案
  • C语言学习笔记之结构体
  • Cribl 在的function 的活用 (pipeline中)
  • day018-磁盘管理-案例
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用控件调色板QPalette)
  • Linux X86平台安装ARM64交叉编译器方法
  • 如何在 AOSP 中判断一个源文件属于哪个模块(以 CameraService 为例)
  • 首次中医知识问答模型微调
  • CSS display有几种属性值
  • 深入理解 Python 中的几种方法:实例方法、类方法、静态方法与特殊方法
  • leetcode 162. Find Peak Element
  • python新手学习笔记①
  • Linux探秘:驾驭开源,解锁高效能——基础指令