LeetCode/字符串解码
给定一个经过编码的字符串,返回它解码后的字符串
输入:s = "3[a2[c]]"
输出:"accaccacc"
字符串栈和数字栈
对于这种具有优先级的操作,使用栈来进行匹配
class Solution {
public:
string decodeString(string s) {
string res = "";//当前层次串,遇到]后逐渐展开
stack <int> nums;//数字栈
stack <string> strs;//字符串栈
int num = 0;//记录当前数
int len = s.size();
for(int i = 0; i < len; ++ i)//遍历所有字符,一个一个处理即可
{
if(s[i] >= '0' && s[i] <= '9')
num = num * 10 + s[i] - '0';//读取数字
else if((s[i] >= 'a' && s[i] <= 'z') ||(s[i] >= 'A' && s[i] <= 'Z'))
res = res + s[i];//读取当前串
else if(s[i] == '[') //将‘[’前的数字压入nums栈内, 字母字符串压入strs栈内
{
nums.push(num);//数字入栈
num = 0;//清空
strs.push(res); //串入栈作为上一层运算
res = "";//当前层重置
}
else //遇到‘]’时,操作与之相配的‘[’之间的字符,使用分配律
{
int times = nums.top();//得到当前倍数
nums.pop();//使用后清掉
for(int j = 0; j < times; ++ j)
strs.top() += res;//复制当前串,这里直接拼接到上一个层串里,因为接下马上展开
res = strs.top(); //之后若还是字母,就会直接加到res之后,因为它们是同一级的运算
//若是左括号,res会被压入strs栈,作为上一层的运算
strs.pop();//使用后清掉
}
}
return res;
}
};