Decode String - C++ Stack 100%
Problem Statement:
Given an encoded string, return its decoded string.
The encoding rule is: k[encoded_string]
, where the encoded_string
inside the square brackets is being repeated exactly k
times. Note that k
is guaranteed to be a positive integer.
You may assume that the input string is always valid; there are no extra white spaces, square brackets are well-formed, etc. Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k
. For example, there will not be input like 3a
or 2[4]
.
The test cases are generated so that the length of the output will never exceed 105
.
Example 1:
Input: s = "3[a]2[bc]" Output: "aaabcbc"
Example 2:
Input: s = "3[a2[c]]" Output: "accaccacc"
Example 3:
Input: s = "2[abc]3[cd]ef" Output: "abcabccdcdcdef"
Constraints:
1 <= s.length <= 30
s
consists of lowercase English letters, digits, and square brackets'[]'
.s
is guaranteed to be a valid input.- All the integers in
s
are in the range[1, 300]
.
Solution:
Example: 3[a2[c]]
After traversal we will have the stack ('',3),(a,2)
and have the string c
as the current string.
From the stack we pop num
and then prevString
.
curString = prevString + num*curString
C++ code:
class Solution {
public:
string decodeString(string s)
{
string curString="", curNum="";
stack<string> stk;
for (char ch: s)
{
if (ch=='[')
{
stk.push(curString);
stk.push(curNum);
curString = "";
curNum = "";
}
else if (ch==']')
{
int num = stoi(stk.top());
stk.pop();
string prevString = stk.top();
stk.pop();
string temp = prevString;
for (int i=0;i<num;i++)
temp += curString;
curString = temp;
}
else if (isdigit(ch))
curNum += ch;
else
curString += ch;
}
return curString;
}
};