一般這個題可使用棧的方式,因爲篇幅緣由,這邊不貼棧的代碼,講一下思路。另一種方法就是計數器法,這個方法是我看了leetcode官方解答以後寫的,思路清奇,值得學習。java
與找到每一個可能的子字符串後再判斷它的有效性不一樣,咱們能夠用棧在遍歷給定字符串的過程當中去判斷到目前爲止掃描的子字符串的有效性,同時能的都最長有效字符串的長度。bash
咱們首先將 -1 放入棧頂。 學習
對於遇到的每一個 '(',咱們將它的下標放入棧中。 ui
對於遇到的每一個 ')' ,咱們彈出棧頂的元素並將當前元素的下標與彈出元素下標做差,得出當前有效括號字符串的長度。spa
經過這種方法,咱們繼續計算有效子字符串的長度,並最終返回最長有效子字符串的長度。
code
就是使用兩個計數器從左到右遍歷,當計數器相同時就知足了匹配成功的條件,每次相同時都須要記錄當前值,若是右計數器大於左計數器,則所有置0,最終取最大長度記錄。再從右往左遍歷,以相同的方式求最大長度。leetcode
詳細代碼以下:字符串
import java.util.*;
class Solution {
public int longestValidParentheses(String s) {
//設置兩個計數器和結果值
int left=0,right=0,maxLength=0;
int length = s.length();
//從左到右遍歷
for(int i=0;i<length;i++){
if(s.charAt(i)=='('){
left++;
}else{
right++;
}
if(left==right){
maxLength=Math.max(maxLength,2*left);
}
if(left<right){
left=0;
right=0;
}
}
//從右往左遍歷
left=0;right=0;
for(int i=length-1;i>=0;i--){
if(s.charAt(i)==')'){
right++;
}else{
left++;
}
if(left==right){
maxLength=Math.max(maxLength,2*right);
}
if(left>right){
left=0;
right=0;
}
}
return maxLength;
}
}複製代碼