目录
- 栈
- 394. 字符串解码
- 739. 每日温度
栈
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;}
};