力扣-394-字符串解码

字符编辑题,最麻烦
重点是这里包含了嵌套,感觉要用到栈,但是用栈怎么做到字符串跟打印数量绑定呢?…复合数据结构?或者两个栈?

遇到数字压数字栈,遇到'['开始接收字符串,在遇到'数字'或']'压字符串栈

  • 数字就循环这一过程
  • ']'就弹一个栈

看题解确实是用两个栈,但是怎么写却很麻烦

string decodeString(string s) {

	stack<int> nums;
	stack<string> strs;
	string num,str,res;

	int n = s.size();
	int i = 0;

	while (i < n) {
		// 获取数字或者字符串输入
		if (s[i] >= '0' && s[i] <= '9') {
			while (s[i] >= '0' && s[i] <= '9' && i < n) {
				num += s[i];
				i++;
			}
		}
		else if (s[i]>='a'&&s[i]<='z') {
			while (s[i] >= 'a' && s[i] <= 'z' && i<n) {
				str += s[i];
				i++;
			}
		}
		else if (s[i] == '[') {
			if (!num.empty()) {
				nums.push(stoi(num));
				num.clear();
			}
			if (!str.empty()) {
				strs.push(str);
				str.clear();
			}
			i++;
		}
		else if (s[i] == ']') {
			if (!num.empty()) {
				nums.push(stoi(num));
				num.clear();
			}
			if (!str.empty()) {
				strs.push(str);
				str.clear();
			}
			while (!nums.empty()) {
				for (int i = 0; i < nums.top(); i++) res += strs.top();
				nums.pop();
				strs.pop();
			}
			i++;
		}
	}
	if (!str.empty()) res += str;
	return res;
}

就完成了实例1,3,2嵌套,4相当于0层嵌套,其实这个打印操作才是应该放到栈中的

不行了,写了一个多小时,好不容易搞定了4个测试用例,还是过不了"3[z]2[2[y]pq4[2[jk]e1[f]]]ef"
然后每次写这种题都感觉自己写得很烂很不优雅

感觉这种题也还是多少有技巧的吧

string decodeString(string s) {

	stack<int> nums;
	stack<string> strs;
	string num,str,res,temp;

	int n = s.size();
	int i = 0;

	while (i < n) {
		// 获取数字或者字符串输入
		if (s[i] >= '0' && s[i] <= '9') {
			while (s[i] >= '0' && s[i] <= '9' && i < n) {
				num += s[i];
				i++;
			}
		}
		else if (s[i]>='a'&&s[i]<='z') {
			while (s[i] >= 'a' && s[i] <= 'z' && i<n) {
				str += s[i];
				i++;
			}
		}
		else if (s[i] == '[') {
			if (nums.empty()) {
				if (!str.empty()) {
					res += str;
					str.clear();
				}
			}
			else {
				if (!str.empty()) {
					strs.push(str);
					str.clear();
				}
			}
			nums.push(stoi(num));
			num.clear();
			i++;
		}
		else if (s[i] == ']') {
			if (!num.empty()) {
				nums.push(stoi(num));
				num.clear();
			}
			if (!str.empty()) {
				strs.push(str);
				str.clear();
			}
			while (!nums.empty()) {
				for (int i = 0; i < nums.top(); i++) temp += strs.top();
				nums.pop();
				if (!nums.empty()) {
					strs.top() += temp;
					temp.clear();
				}else strs.pop();
			}
			res += temp;
			temp.clear();
			i++;
		}
	}
	if (!str.empty()) res += str;
	return res;
}

安心看题解,我尽力了

string decodeString(string s) {
	string res,temp;
	// 用动态数组模拟栈
	// 这里只用了一个栈,因为弹栈'['的下一个一定是数字
	vector<string> stk;

	int i = 0;
	while (i < s.size()) {
		// 读连续的数字
		if (isdigit(s[i])) {
			// 数字不可能是最后一个,所以这里不加i<n
			while (isdigit(s[i])) temp += s[i++];
			stk.push_back(temp);
			temp.clear();
		}
		else if(isalpha(s[i])||s[i]=='[') {
			stk.push_back(string(1,s[i++]));
		}
		else {
			i++;
			while (stk.back() != "[") {
				// 获取字符串
				temp = stk.back() + temp;
				stk.pop_back();
			}
			stk.pop_back();// 弹出左括号
			string str;
			int j = stoi(stk.back());
			stk.pop_back();// 弹出用掉的数字
			while (j--) str += temp;
			temp.clear();
			stk.push_back(str);
		}
	}
	// "abc3[cd]xyz"可能还剩下像abc这样的
	for (string s : stk) res += s;
	return res;
}

题解这边就是要字符和'['一起入栈,遇到']'就取一个数字打印栈中直到'['的字符,并刷新入栈

由于题目性质,‘[’前面一定是数字,所以可以只用一个栈

posted @ 2022-11-10 15:38  YaosGHC  阅读(47)  评论(0)    收藏  举报