人生第一道困难题一次提交通过!!!!!!!!!!!!!!!!!!!!!!!!!!
题目:给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
思路:通过循环记录左右括号的个数,当右括号个数大于左括号个数时即为不合法。最后通过记录右括号的个数 * 2即为所求长度。
总结:这题思路和leetcode 3:无重复最长字串差不多。但是需要注意的点是如何判断括号的合法性,一开始单纯的以为只要右括号大于左括号就是不合法,其他就是合法的。但是最后自己写测试用例的时候发现还有一些情况需要处理,比如“()()(()”这种情况,按一开始的算法会得出长度6,但是题目要求是连续所以正确答案应该是4。
所以需要记录每次遍历一个字符时,目前位置右括号最大的个数,但是代价就是开销很大。
public int longestValidParentheses(String s) {
int l = 0, r = 0;
int max = 0;
for (int left = 0;left < s.length(); left++) {
int right = left;
while (right < s.length()) {
char c = s.charAt(right++);
if (c == '(')
l++;
if (c == ')') {
if (r >= l) {
max = Math.max(max,r); //遇到不合法括号记录当前最大的合法括号数
l = 0;
r = 0;
left = right - 1;
break;
} else {
r++;
}
}
//为了处理不连续的问题
if (l == r)
max = Math.max(max,r);
}
l = 0;
r = 0;
}
return max * 2;
}