1. 程式人生 > >LeetCode---32.最長有效括號

LeetCode---32.最長有效括號

題目來源:https://leetcode-cn.com/problems/longest-valid-parentheses/description/

題目描述:

演算法描述:

1.定義一個maxLength記錄最長有效括號長度,beginIndex記錄有效括號的起始位置。

2.從字串的第一個位置開始遍歷,遇到左括號的話就入棧,遇到右括號的話就將棧頂元素彈出,並且判斷當前序列的有效括號長度。 棧裡儲存的是左括號的位置。

3.當遇到右括號時,分別有如下幾種情況:

 (1).當棧為空時,說明該右括號一定無法匹配,這時讓beginIndex加1,表明有效括號應該從該右括號的下一個位置開始找

 (2).當前棧內有元素,則將棧頂元素出棧。如果彈出後的棧為空,則表明當前括號匹配,這時計算出當前的當前有效括號長度,即當前位置的值i減去beginIndex的值。再讓這個值和maxLength比較,若這個值大,則讓maxLength等於這個值。

 (3).當前棧內有元素並且棧頂出棧後仍然有元素,則當前有效括號長度為當前元素位置減去棧頂元素的位置。

程式碼如下:

int longestValidParentheses(char* s) {
	//計算字串長度 
    int len=strlen(s);
    //定義一個棧 
    int stack[len+1];
    //可以看成是棧頂指標 
    int top=-1;
    //最長有效括號長度 
    int maxLength=0;
    //有效括號的起始位置
    int beginIndex=0;
    for(int i=0;i<len;i++){
        if(s[i]=='('){
        	//如果是左括號直接入棧 
            stack[++top]=i;
        }else{    
            if(top==-1){
            	//如果是右括號,且當前棧無元素,令有效括號起始位置加1 
                beginIndex=i+1;
            }else{
            	//如果棧不空,棧頂元素出棧 
                top--;
                if(top==-1){
                	//如果棧頂出棧後棧為空,說明當前括號匹配,計算當前有效括號長度 
                    maxLength=maxLength>(i-beginIndex+1)?maxLength:(i-beginIndex+1);
                }else{
                	//如果棧頂出棧後棧不為空,則當前有效括號長度為當前元素位置減去棧頂元素的位置 
                    maxLength=maxLength>(i-stack[top])?maxLength:(i-stack[top]);
                }
            }
        }
    }
    return maxLength;
}