// Source : https://leetcode.com/problems/decode-string/ // Author : Hao Chen // Date : 2016-09-08 /*************************************************************************************** * * Given an encoded string, return it's 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; 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 won't be input * like 3a or 2[4]. * * Examples: * * s = "3[a]2[bc]", return "aaabcbc". * s = "3[a2[c]]", return "accaccacc". * s = "2[abc]3[cd]ef", return "abcabccdcdcdef". ***************************************************************************************/ class Solution { public: string decodeString(string s) { if (!isValid(s)) return ""; stack _stack; stack _nstack; string result; string tmp; int n=0; for (int i=0; i0; n--) { tmp += _stack.top(); } _stack.pop(); _nstack.pop(); if ( ! _stack.empty() ) { _stack.top() += tmp; }else { result += tmp; } } else { if ( ! _stack.empty() ) { _stack.top() += s[i]; } else { result += s[i]; } } } return result; } private: //only check the following rules: // 1) the number must be followed by '[' // 2) the '[' and ']' must be matched. bool isValid(string& s) { stack _stack; for (int i=0; i='0' && ch<='9'); } };