题目大意:
最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())" 输出: 4 解释: 最长有效括号子串为"()()"
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=32
解题思路:
题意很简单,第一想法就是利用递归或者动态规划DP。我是用递归来做的,先捋一捋思路。求最长的有效括号子串长度。括号可以嵌套多层,如果内层子串不是连续有效的话,那么其父层字符串一定不是有效串。反之,如果子串是有效串,并且子串前一字符为正括号,子串后一字符为反括号,则父层也为有效串。那么如何找到子串的开始位置呢?出现括号嵌套的位置也就是子串开始的位置,换句话说,当连续出现两个正括号时,第二个正括号则为子串的开始位置,这个位置也是递归的入口。子串的递归开始后,若下一位仍是正括号,则继续递归,直到出现反括号,则找到了第一个有效子串,当出现连续两个反括号时,第一个反括号应该是子串的结尾位置,返回父层。简单来说,递归的最内层的有效子串一定是一组或者多组连续的括号对,即”()”或者”()()()()”。
再考虑一下例外情况,按照上面的逻辑,子串一定是以正括号开头,也就是开始时,当前字符为正括号,如果下一字符为反括号,则i+1,跳过反括号,继续向后匹配。直到当前字符出现反括号时,需跳出当前递归。
但是原字符串(题目给出的字符串s)则不同,当前字符为反括号时,只是代表当前有效子串的位置结束,之后还有可能存在更长子串,因此循环不能结束,还应继续向后匹配,直到字符串结束。
最后看一下完整代码:
int max = 0; // 返回结果
public int longestValidParentheses(String s) {
find(s, true, 0);
return max;
}
private int find(String s, boolean isOrigin, int startIndex) {
int count = 0; // 当前有效长度
for (int i = startIndex; i < s.length(); i++) {
char c = s.charAt(i); // 当前字符
// 当前字符为正括号
if (c == '(') {
// 如果当前字符为最后一位,退出循环。
if (i == s.length() - 1) {
break;
}
// 如果下一位字符仍是正括号
if (s.charAt(i + 1) == '(') {
// 从下一位开始递归嵌套子字符串,取得其有效长度
int childCount = find(s, false, i + 1);
// 如果有效长度为0,则结束循环。
// 注意,因为当前字符及下一位字符均为正括号,childCount为0只有一种可能
// 即是,当前位置到字符串结尾均为正括号,所以可以结束循环。
if (childCount == 0) {
break;
}
// childCount大于0,且长度为childCount的嵌套子串被正括号与反括号包围
if (i + childCount + 1 < s.length() && s.charAt(i + childCount + 1) == ')') {
// 有效长度应为原有效长度 + childCount + 2
count += (childCount + 2);
} else {
break;
}
// index跳过有效嵌套子串长度加一,继续循环。
i += (childCount + 1);
} else {
// 如果下一位字符为反括号,则找到一组括号对,count加2
count += 2;
// 跳过下一位的反括号继续循环
i += 1;
}
} else {
// [else]当前字符为反括号的情况。
// 如果是原始字符
if (isOrigin) {
// 清算当前长度后继续循环。
max = Math.max(count, max);
count = 0;
} else {
// 如果是嵌套子串,说明有效子串结束,退出循环
break;
}
}
}
max = Math.max(count, max);
return count;
} 本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-32-longest-valid-parentheses解题思路分析/