首页 > 编程语言 >leetcode热题100(394. 字符串解码)c++

leetcode热题100(394. 字符串解码)c++

时间:2025-01-02 21:00:05浏览次数:3  
标签:string 示例 int c++ 括号 394 字符串 热题 输入

链接:394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300] 

思路

        一眼看到[]这个中括号很明显就是要我们用栈来解决,然后前面有的数字就是将括号中的字符串翻倍了。很容易我们可以想到用两个栈,一个记录当前括号的倍数栈,一个用于记录当前括号包含的字符串,那么当我们遇到 ']' 的时候,就可以将当前括号的字符串和上个括号的进行连接,以此类推我们就可以得到最外层那个数字[]包含的一个完整的字符串了。

代码如下

class Solution {
public:
    string decodeString(string s) {
        int n = s.size();
        stack<int> num;
        stack<string> strs;
        string res = "";
        int val = 0;
        for(int i=0;i<n;i++){
            char c = s[i];
            
            if(c>='0' && c<='9'){
                val = val*10+(c-'0');
            }else if(c=='['){
               num.push(val);
               strs.push(res);
               //cout<<val<<" "<<res<<endl;
               val = 0;
               res = "";
            }else if(c==']'){
                string tmp = res; //记录当前[****]里面的字符串
                for(int j=0;j<num.top()-1;j++){ //再加上他的倍数-1个
                    res+=tmp;
                }
                //cout<<strs.top()<<" "<<res<<endl;
                res = strs.top()+res;   //然后就根前面字符串连接起来
                num.pop();
                strs.pop();
            }else {
                res+=s[i];
            }
        }
        return res;

    }
};

标签:string,示例,int,c++,括号,394,字符串,热题,输入
From: https://blog.csdn.net/qq_63707333/article/details/144894785

相关文章

  • <<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>
    目录类的定义访问限定符 类域实例化实例化的概念 类的定义class为定义类的关键字,Date为类的名字(类名就相当于类型),{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员......
  • 【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思
    文章目录常见位运算1.位1的个数2.比特位计数3.汉明距离4.只出现一次的数字5.只出现一次的数字III6.只出现一次的数字II7.判定字符是否唯一8.丢失的数字9.两整数之和10.只出现一次的数字II常见位运算判断一个数的二进制表示的第x位是0还是1(n>>x)&1......
  • DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题(修复 0xc000007b 错误
    DirectX修复工具V4.3绿色增强版:完美解决DirectX和C++问题简介DirectX修复工具是一款专为检测和修复DirectX问题而设计的实用工具。它能够精准定位问题并进行高效修复,特别是针对0xc000007b错误,拥有极高的修复成功率。本工具支持所有版本DirectX修复,同时增强版还额......
  • C++返回值优化 RVO 和 NRVO
    RVO(ReturnValueOptimization)指的是当函数返回一个临时对象时,编译器会尝试直接将这个临时对象构建在调用者提供的存储空间中,而不是先创建一个临时对象再进行复制。这样就可以避免一次复制操作,提高效率。如:MyClassfunc(){returnMyClass();//返回一个临时对象}......
  • 只谈C++11新特性 - 显式转换函数
    显式转换函数背景与问题在C++11之前,explicit关键字只能用于构造函数。其作用是阻止构造函数在需要隐式转换时被调用。例如:示例问题(C++11之前的explicit用法)#include<iostream>classExample{public:explicitExample(intvalue){std::cout<<......
  • C++中的仿函数
    梅花芳香四溢,我们一往无前文章目录一、仿函数的定义二、仿函数的特性三、仿函数的相对性能优势总结一、仿函数的定义在C++中,仿函数(Functors)或称为函数对象(FunctionObjects)是重载了调用操作符operator()的类或结构体,这使得这些类的对象可以像函数一样被调用。仿......
  • C++多态
    多态概念        用基类指针(同引用)指向从它继承的一组派生类对象,调用派生类的同名覆盖方法,基类指针指向哪个派生类对象,就会调用相应派生类对象的同名覆盖方法,怎么做到的呢?        因为通过基类指针调用派生类的同名覆盖方法时,发生了动态绑定,访问了基类指针......
  • C++ hashtable
    文章目录1.基本概念2.哈希函数3.哈希冲突及解决方法开放定址法链地址法再哈希法建立公共溢出区4.哈希表的操作实现5.内存管理及优化时间复杂度理想情况(无哈希冲突或冲突极少)一般情况(考虑哈希冲突及解决方法)综合来看以下是关于哈希表(Hashtable)实现原理的详细介......
  • 打卡信奥刷题(523)用C++信奥P6861[普及组/提高] [RC-03] 难题
    [RC-03]难题题目描述求两个整数a,ba,ba,b(......
  • C++11新增关键字之final和override
    C++11中新增了两个关键字final和override,我们分别来学习这两个关键字的使用。一,final   1,final用于修饰类,表示此类不想被其他的类继承。   2, final用于修饰虚函数,表示该虚函数不想被重写。     测试代码:   1,用于修饰类#include<iostream>......