Description:
Given a string S of ‘(’ and ‘)’ parentheses, we add the minimum number of parentheses ( ‘(’ or ‘)’, and in any positions ) so that the resulting parentheses string is valid.
Formally, a parentheses string is valid if and only if:
- It is the empty string, or
- It can be written as AB (A concatenated with B), where A and B are valid strings, or
- It can be written as (A), where A is a valid string.
Given a parentheses string, return the minimum number of parentheses we must add to make the resulting string valid.
Example 1:
Input: "())"
Output: 1
Example 2:
Input: "((("
Output: 3
Example 3:
Input: "()"
Output: 0
Example 4:
Input: "()))(("
Output: 4
Note:
- S.length <= 1000
- S only consists of ‘(’ and ‘)’ characters.
题意:给定一个只包含’(‘和’)‘字符的字符串,计算最少增加多少个’(‘或’)'使得这个字符串中的括号可以正确的匹配;
解法:对于判断括号是否正确匹配,我们通常是用栈来实现的;那么,这一道题我们同样可以利用栈来实现;遍历字符串,每次将左括号入栈,遇到右括号时,如果栈不为空则正确匹配到了左括号,否则,我们需要向字符串中增加一个左括号;这样,遍历完数组以后,我们还需要加上栈中还剩余的左括号的数量(即栈的长度),说明还缺少一定数量的右括号;
Java
class Solution {
public int minAddToMakeValid(String S) {
int result = 0;
Stack<Character> parentheses = new Stack<>();
for (int i = 0; i < S.length(); i++) {
if (S.charAt(i) == '(') parentheses.push(S.charAt(i));
else if (!parentheses.empty()) parentheses.pop();
else result++;
}
return result + parentheses.size();
}
}