【LeetCode394】-字符串解码

方法一(栈)

实现思路:

由于这道题也是在右方括号出现之后,才能确定这一小段序列,符合栈后进先出的特性,所以维护两个栈,一个栈维护子字符串重复的次数,另一个栈维护子字符串

这道题本身不难,但不要忘记一些小的点,如判断如判断栈中元素是否为空,注意数字可能不止一位有多位的情况

实现代码:

注意拼接字符串的使用,字符串和字符串的拼接直接使用+即可,在字符串后面要添加字符时使用push_back()

#include <iostream>
#include <stack>
#include <cctype>
using namespace std;

class Solution {
    
    
public:
	string decodeString(string s) {
    
    
		int n = s.length();
		stack<int> integer;
		stack<string> re;
		for (int i = 0;i < n;i++) {
    
    
			if (isdigit(s[i])) {
    
    
				if (i > 0 && isdigit(s[i - 1]))
				{
    
    
					int t = integer.top();integer.pop();
					t = 10 * t + (s[i] - '0');
					integer.push(t);
				}
				else integer.push(s[i]-'0');
			}
			else if (isalpha(s[i])||s[i]=='[') {
    
    
				string st = "";
				st.push_back(s[i]);
				re.push(st);
			}
			else if (s[i]==']') {
    
    
				string st = "";
				while (!re.empty() && re.top() != "[") {
    
    
					st = re.top() + st;
					re.pop();
				}
				if (!re.empty()) re.pop();
				int nn = integer.empty() ? 0 : integer.top();
				if (!integer.empty()) integer.pop();
				string stt= "";
				if (nn == 0) stt = st;
				else for (int j = 0;j < nn;j++) stt = stt + st;
				re.push(stt);
			}
		}
		if (re.empty()) return "";
		string sre = "";
		while (!re.empty()) {
    
    
			sre = re.top() + sre;
			re.pop();
		}
		return sre;
	}
	
};
int main() {
    
    
	string s = "100[a]";
	Solution ss;
	cout << ss.decodeString(s) << endl;
	return 0;
}

运行结果及分析:

在这里插入图片描述

时间复杂度和空间复杂度大致应该都为O(n)

拓展思路:

可以用左右括号的出现划分不同的状态,当做括号出现的时候,存储倍数的数值,当右括号出现的时候,计算倍数和子字符串存储到临时字符串中


方法二(递归)

实现思路

符合递归的规律,子问题解决之后父问题也会得到解决

实现代码

在这里插入图片描述在这里插入图片描述

分析

时间复杂和空间复杂度 O(n),且在实现的过程中有什么是状态,什么时候返回状态

总结

这道题主要是能理解后进先出的特性和子问题的特性

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/112857040