方法一(栈)
实现思路:
由于这道题也是在右方括号出现之后,才能确定这一小段序列,符合栈后进先出的特性,所以维护两个栈,一个栈维护子字符串重复的次数,另一个栈维护子字符串
这道题本身不难,但不要忘记一些小的点,如判断如判断栈中元素是否为空,注意数字可能不止一位有多位的情况
实现代码:
注意拼接字符串的使用,字符串和字符串的拼接直接使用+即可,在字符串后面要添加字符时使用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),且在实现的过程中有什么是状态,什么时候返回状态
总结
这道题主要是能理解后进先出的特性和子问题的特性