LeetCode:实现字符串解码

题目描述:
给定一个经过编码的字符串,返回它解码后的字符串.
编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复
k次.注意k保证为正整数.

示例 1:
Input:s="3[a]2[bc]"
Output:"aaabcbc"

示例 2:
Input:s="3[a2[c]]"
Output:"accaccacc"

示例 3:
Input:s="2[abc]3[cd]ef"
Output:"abcabccdcdcdef"

解题思路:
这道题是典型的栈算法,构建两个栈,数字存放在数字栈,存放在数字栈,字符串存放在字符串栈,遇到
右括号时候弹出一个数字栈,字母栈弹到左括号为止.

C++实现 

#include <iostream>
#include <stack>
#include <string>

using namespace std;

class Solution{
private:
    string s;

public:
    Solution(string& _s):s(_s){}
    string decodeString(){
        string result="";
        auto num=0;
        stack<int> nums;
        stack<string> strs;
        for(auto letter=0;letter<s.size();letter++){
            if(s[letter]>='0'&&s[letter]<='9')
                num=num*10+s[letter]-'0';/*字符0代表的是48*/
            else if(s[letter]=='['){             
                nums.push(num);
                num=0;
                strs.push(result);
                result="";
            }else if(s[letter]==']'){
                int n=nums.top();
                nums.pop();
                for(auto i=1;i<=n;++i)
                   strs.top()+=result;
                result=strs.top();
                strs.pop();
            }else
                result+=s[letter]; /*a~z或A~Z*/
        }
        return result;
    }
};

int main(int argc,char* argv[]){
    string s="3[a]2[bc]";
    string result=Solution(s).decodeString();
    cout<<result<<endl;
    //printf("%s",result.c_str());
    return 0;
}

Go语言实现

package main

import "fmt"

func decodeString(s string)string{
	res:=""/*结果字符串*/
	multi:=0  /*倍数*/
	smulti,sstring:=make([]int,0),make([]string,0)/*数字栈和字符栈*/
	for _,c:=range s{
		/*逐个字符扫描*/
		if c=='['{
			smulti=append(smulti,multi);
			sstring=append(sstring,res)
			multi=0
			res=""
		}else if c==']'{
			tmp:=""
			curMulti:=smulti[len(smulti)-1]/*取出数字*/
			smulti=smulti[:len(smulti)-1]/*移除最后一个元素*/
			for i:=0;i<curMulti;i++{
				tmp+=res
			}
			res=sstring[len(sstring)-1]+tmp /*构建子串*/
			sstring=sstring[:len(sstring)-1] /*移除最后一个元素*/
		}else if c>='0'&&c<='9'{
			multi=multi*10+int(c)-'0'
		}else{
			res+=string(c)
		}
	}
	return res
}

func main(){
	fmt.Println("实现字符串解码")
	s:="3[a2[c]]"
	fmt.Println(decodeString(s))
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值