• 字符串解码


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

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

    示例:

    s = "3[a]2[bc]", 返回 "aaabcbc".
    s = "3[a2[c]]", 返回 "accaccacc".
    s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

    code:从左向右扫描,遇到“]”就向左扫描找“[”,然后处理其中字符。

    class Solution {
    public:
        string decodeString(string s) {
            if(s.empty())
                return "";
    
            int index=0;
            while(index<s.size())
            {
                if(s[index]==']')
                {
                    int start=0;
                    for(start=index-1;start>=0&&s[start]!='[';--start);
                    string tmp(s,start+1,index-start-1);
                    string numStr;
                    --start;
                    while(start>=0&&s[start]>='0'&&s[start]<='9')
                        numStr=s[start--]+numStr;
                    string res;
                    for(int i=0;i<stoi(numStr);++i)
                        res+=tmp;
                    s.replace(start+1,index-start,res);
                    index=start+1+res.size();
                    continue;
                }
                ++index;
            }
            return s;
        }
    };

     code1:用栈

    class Solution {
    public:
        string decodeString(string s) {
            if(s.empty())
                return "";
    
            stack<int> numStack;
            stack<string> strStack;
            int num=0,len=s.size();
            string cur;
            for(int i=0;i<len;++i)
            {
                if(s[i]>='0'&&s[i]<='9')
                {
                    num=num*10+(s[i]-'0');
                }
                else if(s[i]=='[')
                {
                    numStack.push(num);
                    strStack.push(cur);
                    num=0;
                    string tmp;
                    cur.swap(tmp);
                }
                else if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
                {
                    cur+=s[i];
                }
                else if(s[i]==']')
                {
                    int num=numStack.top();
                    numStack.pop();
                    for(int i=0;i<num;++i)
                        strStack.top()+=cur;
                    cur=strStack.top();
                    strStack.pop();
                }
            }
            return cur;
        }
    };
  • 相关阅读:
    Avoiding the Backup of Online Redo Logs
    RMAN-20201: datafile not found in the recovery catalog
    ORA-15081: failed to submit an I/O operation to a disk
    字符串替换数字问题
    jstl换行符处理
    字符串匹配问题
    careercup题目20131013
    careercup题目20131010
    careercup题目201330928
    面试题(一)
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12545470.html
Copyright © 2020-2023  润新知