11.5 leetcode打卡
20.有效的括号
原题链接:20. 有效的括号
题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
输入:s = "()[]{}"
输出:true
解题思路
通过HashMap为每个( ), { }, [ ] 分配一个对应的value,此处用的是数字(方便后续判断)。
然后利用栈先进后出的特点,来依次判断每个括号是否与之匹配。
依次遍历字符串的字符,若为左半边括号,则压入栈中, 若为右半边,则(若栈不空)判断栈顶元素是否与之匹配,若匹配则弹出栈顶元素,若不匹配则直接返回false即可。
代码实现
class Solution {
public:
bool isValid(string s) {
unordered_map<char, int> map = {{'(', 1}, {'{', 2}, {'[', 3},
{')', 4}, {'}', 5}, {']', 6}};
bool ans = true;
stack<char> stack;
for(char ch: s){
int num = map[ch];
if(num >= 1 && num <= 3){
stack.push(ch);
}else if(!stack.empty() && map[stack.top()] == num -3){
stack.pop();
}else{
ans = false; break;
}
}
if(!stack.empty()){
ans = false;
}
return ans;
}
};
32.最长有效括号
原题链接:32. 最长有效括号
题目描述
给你一个只包含
'('
和')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
代码实现
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.size(), ans = 0;
vector<int> dp(len + 1, 0);
for (int i = 1; i < len; i++) {
if (s[i] == ')' && i - dp[i] - 1 >= 0 && s[i - dp[i] - 1] == '(') {
//dp[i - dp[i] - 1]对应当前子串前刚好存在有效子串的情况"()(())"
dp[i + 1] = dp[i] + 2 + dp[i - dp[i] - 1];
}
ans = max(ans, dp[i + 1]);
}
return ans;
}
};
155.最小栈
原题链接:155. 最小栈
题目描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
代码实现
class MinStack {
stack<int> x_stack;
stack<int> min_stack;
public:
MinStack() {
min_stack.push(INT_MAX);
}
void push(int x) {
x_stack.push(x);
min_stack.push(min(min_stack.top(), x));
}
void pop() {
x_stack.pop();
min_stack.pop();
}
int top() {
return x_stack.top();
}
int getMin() {
return min_stack.top();
}
};