天天看點

JAVA程式設計:最長有效括号(LeetCode:32)

給定一個隻包含 '(' 和 ')' 的字元串,找出最長的包含有效括号的子串的長度。

示例 1:

輸入: "(()"

輸出: 2

解釋: 最長有效括号子串為 "()"

示例 2:

輸入: ")()())"

輸出: 4

解釋: 最長有效括号子串為 "()()"

思路:做法參考官方題解:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode/

JAVA程式設計:最長有效括号(LeetCode:32)
class Solution {
    public int longestValidParentheses(String s) {
        int ans=0;
        int dp[]=new int[s.length()];
        for(int i=1;i<s.length();i++)
        {
        	if(s.charAt(i)==')')
        	{
        		if(s.charAt(i-1)=='(')
        			dp[i]=(i>2?dp[i-2]:0)+2;
        		else if(i-dp[i-1]>0 && s.charAt(i-dp[i-1]-1)=='(')
        			dp[i]=dp[i-1]+(i-dp[i-1]>=2?dp[i-dp[i-1]-2]:0)+2;
        		ans=Math.max(ans,dp[i]);
        	}
        }
        return ans;
    }
}
           

方法二:棧。 我們考慮每次将還沒有消除的‘(’或者‘)’的下标存入棧中, 目前若為‘)’的話,判斷棧頂下标的位置是否為‘(’,如果是的話我們可以通過索引求內插補點來更新答案。

class Solution {
    public int longestValidParentheses(String s) {
        int ans=0;
        Stack st=new Stack();
        st.push(-1);
        for(int i=0;i<s.length();i++)
        {
        	if(s.charAt(i)==')' && (int)st.peek()>=0 && s.charAt((int)st.peek())=='(')
        	{
        		st.pop();
        		ans=Math.max(ans,i-(int)st.peek());
        	}
        	else
        		st.push(i);
        }
        return ans;
    }
}
           

繼續閱讀