20. 有效的括号
cpp
class Solution {
public:
bool isValid(string s) {
if(s.size()%2 !=0)
return false;
stack<char> st;
for(int i=0;i<s.size();i++) {
if(s[i]=='(' || s[i]=='{' || s[i]=='[')
st.push(s[i]);
else if(st.empty() && (s[i]=='}' || s[i]==']' || s[i]==')'))
return false;
else if(!st.empty()) {
char ch = st.top();
st.pop();
if((ch=='(' && s[i]==')') || (ch=='[' && s[i]==']')||(ch=='{' && s[i]=='}'))
continue;
else
return false;
}
}
if(!st.empty())
return false;
return true;
}
};
394. 字符串解码
cpp
class Solution {
public:
string getDigits(string &s, size_t &ptr) {
string ret = "";
while(isdigit(s[ptr])) {
ret.push_back(s[ptr++]);
}
return ret;
}
string getString(vector<string>& v){
string ret;
for(const auto &s : v) {
ret+=s;
}
return ret;
}
string decodeString(string s) {
vector<string> stk;
size_t 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();
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. 每日温度
cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
if(temperatures.size()==1)
return vector<int>(0);
stack<int> st;
vector<int> res(temperatures.size(),0);
st.push(0);
for(int i=0;i<temperatures.size();i++) {
if(temperatures[i] <= temperatures[st.top()]) {
st.push(i);
}
else {
while(!st.empty() && temperatures[i] > temperatures[st.top()]) {
res[st.top()] = i-st.top();
st.pop();
}
st.push(i);
}
}
return res;
}
};
155. 最小栈
加粗借助一个栈min_st保存加入栈顶元素后当前栈的最小值
cpp
class MinStack {
stack<int> x_st;
stack<int> min_st; //辅助栈,每一个元素入栈的时候都附带存储一个当前站内元素的最小值
public:
MinStack() {
min_st.push(INT_MAX);
}
void push(int val) {
x_st.push(val);
min_st.push(min(min_st.top(),val));
}
void pop() {
x_st.pop();
min_st.pop();
}
int top() {
return x_st.top();
}
int getMin() {
return min_st.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
139. 单词拆分
动态规划的题
cpp
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordset(wordDict.begin(),wordDict.end());
vector<bool> dp(s.size()+1,false);
dp[0]=true;
for(int i=0;i<=s.size();i++) {
for(int j=0;j<i;j++) {
string str = s.substr(j,i-j);
if(wordset.find(str) != wordset.end() && dp[j])
dp[i]=true;
}
}
return dp[s.size()];
}
};