LeetCode 394. 字符串解码 题解 C/C++

遍历字符串
数字入栈,左括号入栈,字符入栈
遇到右括号开始出栈,一直到对应左括号出栈
出栈序列翻转后拼成一个字符串,此时栈顶即是该字符串的重复次数
构建新的字符串入栈,重复以上操作。

class Solution {
public:

	string getDigits(string s,size_t *ptr) {
		string str = "";
		while(isdigit(s[*ptr])) {
			str.push_back(s[(*ptr)++]);
		}
		return str;
	}
	//把容器中的string连成一个字符串返回
	string getString(vector<string> vec) {
		string ret = "";
		for(size_t i = 0;i<vec.size();++i) {
			ret+=vec[i];
		}
		return ret;
	}
	string decodeString(string s) {
		size_t len = s.length();
		size_t i = 0;
		vector<string> stk;//用不定长数组模拟栈的原因是方便从栈底到栈顶遍历(翻转字符串用)
		while(i<len) {
			char ch = s[i];
			if(isdigit(ch)) {//数字入栈
				string num = getDigits(s,&i);
				stk.push_back(num);
			}
			else if(isalpha(ch)||ch=='[') {//字符或者左括号入栈
				stk.push_back(string(1,s[i++]));//将这个字符转成字符串后入栈
			}
			else {//右括号  一直出栈,直到遇见左括号
				vector<string> sub;
				while(stk.back()!="[") {
					sub.push_back(stk.back());
					stk.pop_back();
				}
				stk.pop_back();//左括号出栈
				int rep = stoi(stk.back());//所对应字符串重复字数 stoi字符串转数字
				stk.pop_back();
				reverse(sub.begin(),sub.end());//algorithm
				string s1 = "",s2 = getString(sub);//把容器中的string拼起来
				while(rep--) {
					s1+=s2;
				}
				stk.push_back(s1);
				i++;
			}
		}
		return getString(stk.back());

	}
};

你可能感兴趣的:(LeetCode,华为,c++,c语言)