栈
394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
class Solution {
public:
string getDigits(string &s, int& ptr){
string ret = "";
while(isdigit(s[ptr])){
ret.push_back(s[ptr++]);
}
return ret;
}
string getString(vector<string> &v){
string ret;
for(auto &s : v){
ret += s;
}
return ret;
}
string decodeString(string s) {
vector<string> stk;
int ptr = 0;
while(ptr < s.size()){
char cur = s[ptr];
if(isdigit(cur)){
// 获取一个数字并进栈
string digits = getDigits(s, ptr);
stk.push_back(digits);
}
else if(isalpha(cur) || cur == '['){
// 获取一个字母并进栈
stk.push_back(string(1, s[ptr++]));
}
else{
ptr++;
vector<string> sub;
while(stk.back() != "["){
sub.push_back(stk.back());
stk.pop_back();
}
reverse(sub.begin(), sub.end());
// 左括号出栈
stk.pop_back();
// 此时栈顶为当前sub对应的字符串应该出现的次数
int repTime = stoi(stk.back());
stk.pop_back();
string t, o = getString(sub);
// 构造字符串
while(repTime--){
t += o;
}
stk.push_back(t);
}
}
return getString(stk);
}
};
739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
stack<int> s;
for(int i = 0; i < n; i++){
while(!s.empty() && temperatures[i] > temperatures[s.top()]){
int previousIndex = s.top();
ans[previousIndex] = i - previousIndex;
s.pop();
}
s.push(i);
}
return ans;
}
};