class Solution {
//方法2:使用栈
// public int longestValidParentheses(String s){
// //利用栈可以匹配括号是否有效的特性,用栈遍历一次字符串,
// //将所有无法进行匹配的括号都标记下来;最后统计未标记括号的最大长度即可
// int n = s.length();
// Deque<Integer> stack = new LinkedList<>();
// boolean[] flag = new boolean[n];
// for(int i = 0;i < n;i++){
// char c = s.charAt(i);
// if(c == '(')
// stack.push(i);
// else{
// //出现右括号,但无左括号可匹配,标记
// if(stack.isEmpty())
// flag[i] = true;
// else
// stack.pop();
// }
// }
// //多余的左括号也是无法匹配的,标记
// while(!stack.isEmpty()){
// flag[stack.pop()] = true;
// }
// //统计最长
// int count = 0,maxCount = 0;
// for(int i = 0;i < n;i++){
// if(flag[i]){
// maxCount = Math.max(maxCount,count);
// count = 0;
// }else
// count++;
// }
// return Math.max(maxCount,count);
// }
//方法1:从左向右以及从右向左都遍历一次
// public int longestValidParentheses(String s) {
// //用一个数组记录到当前位置为止出现的左右括号;左括号+1,右括号-1
// //1.f[i] = f[i-1] + s(i) ;f[i-1]>=0时
// //2.f[i] = s(i);f[i-1]<0时
// //从左向右以及从右向左都遍历一遍,就可以得到答案。
// if(s.length() <= 0)
// return 0;
// int n = s.length();
// int[] f = new int[n];
// f[0] = getNum(s.charAt(0));
// for(int i = 1;i < n;i++){
// char c = s.charAt(i);
// if(f[i-1] >= 0)
// f[i] = f[i-1] + getNum(c);
// else
// f[i] = getNum(c);
// }
// int count = 0,maxCount = 0;
// for(int i = 0;i < n;i++){
// if(f[i] >= 0)
// count++;
// else
// count = 0;
// if(f[i] == 0)
// maxCount = Math.max(maxCount,count);
// }
// int[] f2 = new int[n];
// f2[n-1] = 0-getNum(s.charAt(n-1));
// for(int i = n-2;i >= 0;i--){
// char c = s.charAt(i);
// if(f2[i+1] >= 0)
// f2[i] = f2[i+1] - getNum(c);
// else
// f2[i] = 0-getNum(c);
// }
// int count2 = 0,maxCount2 = 0;
// for(int i = n-1;i >= 0;i--){
// if(f2[i] >= 0)
// count2++;
// else
// count2 = 0;
// if(f2[i] == 0)
// maxCount2 = Math.max(maxCount2,count2);
// }
// return Math.max(maxCount,maxCount2);
// }
// public int getNum(char c){
// if(c == '(')
// return 1;
// else
// return -1;
// }
}
leetcode32. 最长有效括号
最新推荐文章于 2024-09-27 14:28:55 发布