leetcode_32.最长有效括号
最长有效括号
1.题目
题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
题目截图:
解法一:
2.大致思路
对于括号配对的问题,很自然的就可以想到利用栈来解决。利用的数据结构是栈。
例如对于输入“)()())”,从头扫描字符串,如果遇到的是“(”则使其入栈,如果遇到的是“)”则与栈顶元素进行比对,如果配对成功则消去这两个字符,否则入栈。这里计算最长有效括号的长度就是用消去之前的栈顶元素-消去之后的栈顶元素。
示例:
3.相关代码(java)
class Solution { public int longestValidParentheses(String s) { //如果栈为空或者输入的字符串长度为0,那么肯定输出为0 if (s == null || s.length() == 0) { return 0; } int n = s.length();//n用于记录字符串的长度 char[] sArr = s.toCharArray();//将字符串转换为字符数组的形式,便于对其进行遍历 Stack<Integer> stack = new Stack<>();//定义一个栈 int result = 0;//利用result来记录有效括号的长度 // 在开始扫描前先将-1入栈 stack.push(-1); for (int i = 0; i < n; ++i) { //遇到“)”时,栈不为空并且栈顶元素为“(”,进行的操作便是栈顶出栈进行配对,并记录最长有效括号的长度 if (sArr[i] == ')' && stack.size() > 1 && sArr[stack.peek()] == '(') { stack.pop();
result = Math.max(result, i - stack.peek()); } else { stack.push(i); } } return result; } }
解法二:
2.大致思路
利用两个变量,left和right分别表示左括号和右括号的出现次数。从左向右扫描遇到左括号时left+1,遇到右括号时right+1。当left==right时说明为有效括号,记录当前有效括号的长度;当右括号数量超过左括号时是一定不能组成有效括号的,此时left和right重置为0。
为了避免“(()”这样的情况,可以进行反向遍历来处理。
3.相关代码(java)
class Solution { public int longestValidParentheses(String s) { int left=0,right=0,maxlength=0; //从左向右 for(int i=0;i<s.length();i++){ if(s.charAt(i)=='(') left++; else right++; if(left==right){ maxlength=Math.max(maxlength,2*right); } else if(right>=left){ left=right=0; } } left=right=0; //从右到左 for(int i=s.length()-1;i>=0;i--){ if(s.charAt(i)=='(') left++; else right++; if(left==right){ maxlength=Math.max(maxlength,2*left); } else if(right<=left){ left=right=0; } } return maxlength; } }
各自努力,不问归期