【经典面试】87 字符串解码

这篇具有很好参考价值的文章主要介绍了【经典面试】87 字符串解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

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

题解1 递归(程序栈)——形式语言自动机(LL(1)) : O(S)

class Solution {
    int idx;
public:
    int getdigits(string& s){
        int ret = 0;
        while(idx < s.size() && isdigit(s[idx])){
            ret = ret*10 + s[idx++]-'0';
        }
        return ret;
    } 
    string getstring(string& s){
        // 结束条件
        if(idx == s.size() || s[idx] == ']')
            return string("");
        // 当前字符
        char cur = s[idx];
        // 重复次数置1
        int rep = 1;
        // 返回值
        string ret = "";

        // condition:如果是数字
        if(isdigit(cur)){
            int rep = getdigits(s);
            string str = "";
            // 跳左括号
            idx ++;

            // 顺序很重要:跳完左括号就要 取后面的string
            str = getstring(s);

            // 跳右括号
            idx ++;
            // 后--
            while(rep--){
                ret += str;
            }
        }
        // condition:如果是字母
        else if(isalpha(cur)){
            ret = string(1, s[idx++]);
        }
        return ret+getstring(s);
    }
    string decodeString(string s) {
        idx = 0;
        return getstring(s);
    }
};

【经典面试】87 字符串解码,栈,HOT100,递归,算法,leetcode,数据结构

另一种递归(直观)

class Solution {

public:
    string decodeString(string s) {
        string res = "";
        for(int i = 0; i < s.size(); i++){
        	// 字符
            if(s[i]>='a' && s[i] <= 'z'){
                res += s[i];
            // 左括号或者数字
            }else{
                int rep = 0;
                while(s[i] >= '0' && s[i] <= '9'){
                    rep = rep*10 + s[i++]-'0';
                }
                int curp = i+1;
                int lnum = 1;
                while(lnum){
                    i ++; // i最后是下一次解决的一段字符串的结尾([[[..]]],左括号要和右括号数对上)
                    if(s[i] == '[') lnum++;
                    if(s[i] == ']') lnum--;
                }
                string str = decodeString(s.substr(curp, i-curp));
                while(rep --){
                    res += str;
                }
            }
        }
        return res;
    }
};

【经典面试】87 字符串解码,栈,HOT100,递归,算法,leetcode,数据结构

题解2 2个栈(逆波兰式)

class Solution {

public:
    string decodeString(string s) {
        stack<int> num_stk; // 数字栈
        stack<string> str_stk; // 字符串栈
        string res = ""; // 当前累积的字符串
        // 逆波兰式
        for(int i = 0; i < s.size(); i++){
            if(isdigit(s[i])){
                int tmp = s[i]-'0';
                while(isdigit(s[++i]))
                    tmp = tmp*10 + s[i]-'0';
                num_stk.push(tmp);
                i --; // for 有自增
            }
            else if(s[i] == '['){
                str_stk.push(res); // 把上一段存起来
                res = ""; // 清空,开始累积该左括号后面的字符串
            }else if(s[i] == ']'){
                string tmp = "";
                int rep = num_stk.top();
                num_stk.pop();

                while(rep--)
                    tmp += res;
                
                res = str_stk.top() + tmp;
                str_stk.pop();
            }else{
                res += s[i]; 
            }
        }
        return res;
    }
};

【经典面试】87 字符串解码,栈,HOT100,递归,算法,leetcode,数据结构文章来源地址https://www.toymoban.com/news/detail-715433.html

1个栈(参考官方,但是不喜欢)

class Solution {
public:
    string getDigits(string &s, size_t &ptr) {
        string ret = "";
        while (isdigit(s[ptr])) {
            ret.push_back(s[ptr++]);
        }
        return ret;
    }

    string getString(vector <string> &v) {
        string ret;
        for (const auto &s: v) {
            ret += s;
        }
        return ret;
    }

    string decodeString(string s) {
        vector <string> stk;
        size_t ptr = 0;

        while (ptr < s.size()) {
            char cur = s[ptr];
            if (isdigit(cur)) {
                // 获取一个数字并进栈
                string digits = getDigits(s, ptr);
                stk.push_back(digits);
            } else if (isalpha(cur) || cur == '[') {
                // 获取一个字母并进栈
                stk.push_back(string(1, s[ptr++])); 
            } else {
                ++ptr;
                vector <string> sub;
                while (stk.back() != "[") {
                    sub.push_back(stk.back());
                    stk.pop_back();
                }
                // sub push的顺序是逆序,累积前需要反过来
                reverse(sub.begin(), sub.end());
                // 左括号出栈
                stk.pop_back();
                // 此时栈顶为当前 sub 对应的字符串应该出现的次数
                int repTime = stoi(stk.back()); 
                stk.pop_back();
                string t, o = getString(sub);
                // 构造字符串
                while (repTime--) t += o; 
                // 将构造好的字符串入栈
                stk.push_back(t);
            }
        }

        return getString(stk);
    }
};

到了这里,关于【经典面试】87 字符串解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【面试经典150 | 动态规划】交错字符串

    本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删: Tag:介绍本题牵涉到的知识点、数据结构; 题目来源:

    2024年04月15日
    浏览(39)
  • 小白水平理解面试经典题目LeetCode 594 最大和谐字符串

    这道题属于字符串类型题目,解决的办法还是有很多的,暴力算法,二分法,双指针等等。 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个

    2024年01月23日
    浏览(34)
  • LeetCode - #87 扰乱字符串

    本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅( Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。 )的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 86 期,我们会

    2024年02月06日
    浏览(27)
  • leetcode做题笔记87扰乱字符串

    使用下面描述的算法可以扰乱字符串  s  得到字符串  t  : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 1 ,执行下述步骤: 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串  s  ,则可以将其分成两个子字符串  x  和  y  ,且满足 

    2024年02月12日
    浏览(24)
  • 算法leetcode|87. 扰乱字符串(rust重拳出击)

    使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 1 ,执行下述步骤: 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。 随机

    2024年02月05日
    浏览(32)
  • 字符串解码:给一个字符串,返回解码后的字符串。

    字符串解码,给一个字符串s,返回解码后的字符串。字符串编码规则为k[str]表示括号内部str字符串正好重复k次,k保证为整数,并且输入的字符串肯定符合这种编码规则不会有额外的空格。 注意事项: 注意括号可能发生嵌套,例如输入字符串为 3[a2[c]] 应该返回accaccacc 1 = s

    2024年02月16日
    浏览(29)
  • 【数据结构-字符串 三】【栈的应用】字符串解码

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个

    2024年02月07日
    浏览(66)
  • 【LeetCode】394.字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为:  k[encoded_string] ,表示其中方括号内部的  encoded_string  正好重复  k  次。注意  k  保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    2024年02月11日
    浏览(31)
  • Python字符串的编码和解码

    不同计算机之间进行数据传输,实际上传输的是二进制数据。 将str类型转换成bytes类型,需要用到字符串的encode()方法 Str.encode(encoding=’utf-8’,                Errors=’strict/ignore/replace’) 将bytes类型转换成str类型,需要用到bytes类型的decode()方法 Bytes.decode(encodin

    2024年01月22日
    浏览(34)
  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套PythonJava双语代码, 2024.04.02 可通过leetcode所有测试用例。 目录 349. 两个数组的交集 解题思路 完整代码 Python Java 387. 字符串中的第一个唯一字符 解题思路 完整代码 Python Java

    2024年04月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包