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();
}
}