D11: 好多笔试,但怎么都过不了😓
20. Valid Parentheses
寻找有效括号,这个代码直接写很好写但是会很复杂,如下:
class Solution {
public:
bool isValid(string s) {
stack<char> mysk;
for(char c:s){
if(c=='(' || c=='{' || c=='['){
mysk.push(c);
}else if(mysk.empty()) return false;
else if(c==')'){
if(mysk.top()=='(') mysk.pop();
else return false;
}else if(c==']'){
if(mysk.top()=='[') mysk.pop();
else return false;
}else if(c=='}'){
if(mysk.top()=='{') mysk.pop();
else return false;
}
}
return mysk.empty();
}
};
看了Carl的讲解,才学会技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了:
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
else if (s[i] == '[') st.push(']');
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
else if (st.empty() || st.top() != s[i]) return false;
else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};
1047. Remove All Adjacent Duplicates In String
去除重复字符,题不难,别忘了最后反转字符串,代码如下:
class Solution {
public:
string removeDuplicates(string s) {
stack<char> mysk;
string r;
for (char c : s) {
if (!mysk.empty()) {
if (c == mysk.top()) {
mysk.pop();
continue;
}
}
mysk.push(c);
}
while (!mysk.empty()) {
r.push_back(mysk.top());
mysk.pop();
}
reverse(r.begin(), r.end());
return r;
}
};
150. Evaluate Reverse Polish Notation
对于后缀表达式,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的。
代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> mysk;
for(string s:tokens){
if(s=="+" || s=="-" || s=="*" || s=="/"){
int n1=mysk.top();
mysk.pop();
int n2=mysk.top();
mysk.pop();
int tmp;
if(s=="+") tmp=n2+n1;
else if(s=="-") tmp=n2-n1;
else if (s=="*") tmp = n2 * n1;
else tmp=n2/n1;
mysk.push(tmp);
}else{
mysk.push(stoi(s));
}
}
return mysk.top();
}
};
总结:今天主要是栈的基本使用,注意点是检查括号那里,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了。