LeetCode---32.最長有效括號
阿新 • • 發佈:2018-11-10
題目來源: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; }