题目
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路及代码
kotlin
fun longestValidParentheses(s: String): Int {
if (s.isEmpty() || s.length == 1) return 0
// 存储最长的串长度
var max = 0
// kotlin中使用带index的for循环index被定义为只读无法修改,单独定义变量i
var i = 0
while (i < s.length - 1) {
// 用于存储每次循环的步长,若匹配到一定长度则无需继续查找已经匹配过的字符串
var step = 1
// 若剩余字符串的长度已经小于当前最长子串长度,则跳出循环
if (s.length - i < max) {
break
}
if (s[i] == '(') {
var left = 1
var right = 0
for (j in i + 1 until s.length) {
if (s[j] == '(') {
left++
} else {
right++
if (right > left) break
// 只有当左括号与右括号完全相抵消,才能计入有效字符串
else if (right == left){
step = right*2
max = Math.max(step, max)
}
}
}
}
// 增加相应的步长
i+=step
}
return max
}
java
public int longestValidParentheses(String s) {
if (s.isEmpty() || s.length() == 1) return 0;
int max = 0;
int i = 0;
while (i < s.length() - 1) {
int temp = 1;
if (s.length() - i < max) {
break;
}
if (s.charAt(i) == '(') {
int left = 1;
int right = 0;
for (int j = i+1;j<s.length();j++) {
if (s.charAt(j) == '(') {
left++;
} else {
right++;
if (right > left) break;
else if (right == left){
temp = right*2;
max = Math.max(temp, max);
}
}
}
}
i+=temp;
}
return max;
}