1.判断括号合法性(栈)
bool isValid(string str) {stack<Charavter> stack = new Stack<>();for (char c : str.toCharArray()) {if (c == '(' || c == '{' || c == '[')left.push(c);else { // 字符 c 是右括号if (!left.empty() && leftOf(c) == left.peek())left.pop();elsereturn false; // 和最近的左括号不匹配}}// 是否所有的左括号都被匹配了return left.empty();}char leftOf(char c) {if (c == '}') return '{';if (c == ')') return '(';return '[';}
2.平衡括号字符串的最少插入次数
给定一个由 ‘(‘ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(‘ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。 leetcode 921
通过一个need变量记录对右括号的需求数,根据need的变化来判断是否需要插入
- 遇到左括号,need++
- 遇到右括号,need—
当右括号比左括号还要多need == -1 时:need清零,需插入一个左括号 res++ ```java int minAddToMakeValid(string s) { // 1 个左括号需要匹配 1 个右括号 // 1 个左括号需要匹配 2 个右括号 int res = 0; // res 记录插入左括号次数 int res = 0; int need = 0; // need 变量记录右括号的需求量 int need = 0;
for (int i = 0; i < s.size(); i++) { for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') { if (s[i] == '(') { need++; // 对右括号的需求 + 1 need += 2;// 一个左括号对应两个右括号 } if (need % 2 == 1) { if (s[i] == ')') { res++; need--;// 对右括号的需求 - 1 need--; if (need == -1) { } need = 0; // 归零 } res++;// 需插入一个左括号 if (s[i] == ')') { } need--; } if (need == -1) {//右括号多1个} res++;// 需要插入一个左括号 return res + need; need = 1;// 对右括号的需求变为 1 } }
} } return res + need;
<a name="wvjvl"></a>
### 3.最长有效括号
---
> 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 [**leetcode 32**](https://leetcode-cn.com/problems/longest-valid-parentheses/)

<a name="iIx5I"></a>
#### 总体思路:利用栈存储下标,方便计算有效括号子串长度。
1. 首先将 -1 入栈垫底,充当参照物
1. 当字符为'(',直接将下标入栈
1. 当字符为')',弹出栈顶元素,**若此时栈不为空,说明配对成功**,然后用')'下标减去此时栈顶元素下标即为当前有效括号子串长度;若此时栈为空,说明未配对成功,直接**将')'下标入栈垫底充当参照物**。
```java
public int longestValidParentheses(String s) {
Deque<Integer> stack = new LinkedList<>();
stack.push(-1);
int maxLen = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);
} else if (s.charAt(i) == ')'){
stack.pop();
// ) 配对成功
if (!stack.isEmpty()) {
maxLen = Math.max(maxLen, i - stack.peek());
// ) 配对失败
} else {
stack.push(i);
}
}
}
return maxLen;
}
