(算法)字符串解码————<栈—模拟>

1. 题⽬链接:394.字符串解码

2. 题⽬描述:

3. 解法(两个栈):

算法思路:

对于3[ab2[cd]] ,我们需要先解码内部的,再解码外部(为了⽅便区分,使⽤了空格):

• 3[ab2[cd]] -> 3[abcd cd] -> abcdcd abcdcd abcdcd

在解码cd 的时候,我们需要保存3 ab 2 这些元素的信息,并且这些信息使⽤的顺序是从后往 前,正好符合栈的结构,因此我们可以定义两个栈结构,⼀个⽤来保存解码前的重复次数k (左括号 前的数字),⼀个⽤来保存解码之前字符串的信息(左括号前的字符串信息)。 

C++算法代码: 

class Solution 
{
public:
    string decodeString(string s) 
    {
        stack<int>num;  //数字栈
        stack<string>str;   //字符串栈
        str.push("");
        int i=0;
        while(i<s.size())
        {
            //数字,插入数字栈
            if(isdigit(s[i]))
            {
                int nums=0;
                while(isdigit(s[i])&&i<s.size())
                {
                    nums=nums*10+(s[i++]-'0');
                }
                num.push(nums);
                continue;
            }
            //左括号,提取出后面的字符串
            else if(s[i]=='[')
            {
                i++;
                string temp;
                while(s[i]>='a'&&s[i]<='z')
                {
                    temp+=s[i++];
                }
                str.push(temp);
                continue;
            }
            //右括号,解码
            else if(s[i]==']')
            {
                string key=str.top();
                str.pop();
                for(int i=0;i<num.top();i++)
                {
                    str.top()+=key;
                }
                num.pop();
            }
            //单独的字母,直接缀在栈顶的后面
            else
            {
                str.top()+=s[i];
            }
            i++;
        }
        return str.top();
    }
};

Java算法代码:

class Solution
{
	public String decodeString(String _s)
	{
		Stack<StringBuffer> st = new Stack<>();
		st.push(new StringBuffer()); // 先放⼀个空串进去 
		Stack<Integer> nums = new Stack<>();
		int i = 0, n = _s.length();
		char[] s = _s.toCharArray();
		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++; // 把后⾯的字符串提取出来 
				StringBuffer tmp = new StringBuffer();
				while (i < n && s[i] >= 'a' && s[i] <= 'z')
				{
					tmp.append(s[i]);
					i++;
				}
				st.push(tmp);
			}
			else if (s[i] == ']')
			{
				// 解析 
				StringBuffer tmp = st.pop();
				int k = nums.pop();
				while (k-- != 0)
				{
					st.peek().append(tmp);
				}
				i++;
			}
			else
			{
				StringBuffer tmp = new StringBuffer();
				while (i < n && s[i] >= 'a' && s[i] <= 'z')
				{
					tmp.append(s[i]);
					i++;
				}
				st.peek().append(tmp);
			}
		}
		return st.peek().toString();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

课堂随笔

感谢支持~~~

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

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

打赏作者

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

抵扣说明:

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

余额充值