|
|
|
|
package class14;
|
|
|
|
|
|
|
|
|
|
public class Code01_Parentheses {
|
|
|
|
|
|
|
|
|
|
public static boolean valid(String s) {
|
|
|
|
|
char[] str = s.toCharArray();
|
|
|
|
|
int count = 0;
|
|
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
|
|
count += str[i] == '(' ? 1 : -1;
|
|
|
|
|
if (count < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return count == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int needParentheses(String s) {
|
|
|
|
|
char[] str = s.toCharArray();
|
|
|
|
|
int count = 0;
|
|
|
|
|
int need = 0;
|
|
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
|
|
if (str[i] == '(') {
|
|
|
|
|
count++;
|
|
|
|
|
} else { // 遇到的是')'
|
|
|
|
|
if (count == 0) {
|
|
|
|
|
need++;
|
|
|
|
|
} else {
|
|
|
|
|
count--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return count + need;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static boolean isValid(char[] str) {
|
|
|
|
|
if (str == null || str.length == 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
int status = 0;
|
|
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
|
|
if (str[i] != ')' && str[i] != '(') {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (str[i] == ')' && --status < 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (str[i] == '(') {
|
|
|
|
|
status++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return status == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int deep(String s) {
|
|
|
|
|
char[] str = s.toCharArray();
|
|
|
|
|
if (!isValid(str)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int count = 0;
|
|
|
|
|
int max = 0;
|
|
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
|
|
if (str[i] == '(') {
|
|
|
|
|
max = Math.max(max, ++count);
|
|
|
|
|
} else {
|
|
|
|
|
count--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return max;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// s只由(和)组成
|
|
|
|
|
// 求最长有效括号子串长度
|
|
|
|
|
// 本题测试链接 : https://leetcode.com/problems/longest-valid-parentheses/
|
|
|
|
|
public static int longestValidParentheses(String s) {
|
|
|
|
|
if (s == null || s.length() < 2) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
char[] str = s.toCharArray();
|
|
|
|
|
// dp[i] : 子串必须以i位置结尾的情况下,往左最远能扩出多长的有效区域
|
|
|
|
|
int[] dp = new int[str.length];
|
|
|
|
|
// dp[0] = 0; ( )
|
|
|
|
|
int pre = 0;
|
|
|
|
|
int ans = 0;
|
|
|
|
|
for (int i = 1; i < str.length; i++) {
|
|
|
|
|
if (str[i] == ')') {
|
|
|
|
|
// 当前谁和i位置的),去配!
|
|
|
|
|
pre = i - dp[i - 1] - 1; // 与str[i]配对的左括号的位置 pre
|
|
|
|
|
if (pre >= 0 && str[pre] == '(') {
|
|
|
|
|
dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ans = Math.max(ans, dp[i]);
|
|
|
|
|
}
|
|
|
|
|
return ans;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|