dp 棧 找括號串中最長合法子串

2022-06-01 01:30:10 字數 1500 閱讀 9454

思路: 是否合法,最簡單判斷方法是用棧。只有一種括號,棧中存放元素只需要左括號的下標。 每一次遇到),就把棧頂的乙個左括號下標和當前下標一起壓入vector中,將這個vector排序,就是所有合法子串的下標。遍歷這個vector,找連續的最長值就可以。排序複雜度o(nlogn),除此之外遍歷一次字串,一次vector,o(n)。

int longestvalidparentheses(string

s) }

}if(index.size()==0) return0;

sort(index.begin(),index.end());

int now=0

;

for(int i=0;i1;i++)

}now++;

longest=max(longest,now);

return

longest;

}

改良的stack解法:在想出上面解法的過程中,沒用當前i 減去棧頂元素下標的原因是,遇到連續一串的()()(),沒辦法連起來;實際上這裡只要加入乙個小trick就好了:每一次遇到)的時候,先pop,再算i - stack.top(),  因為stack.top()這個時候,是前面最近乙個還沒被消掉的 (, 減去它就是當前最長串的長度。而當棧空的時候,就說明至此為止,前面所有的(都被消掉了(或者根本沒有左括號),所以這個)是不配對的,把它的下標壓進棧中,作為新的子串的起點前。

棧的最初要壓入乙個-1,相當於在最前面加乙個dummy節點。

int longestvalidparentheses(string

s)

else}}

return

longest;

}

解法2: dp,count[i]表示 結束於i的有效子串長度。count[i] 的計算:

- s[i]=='(" , 一定0

- s[i]==')',

-s[i-1]=='(', count[i]=count[i-2]+2;

-s[i-1]==')',就是有可能巢狀,要看s[i-count[i-1]-1]是否為『(「,若是,為合法的巢狀,要跟這個巢狀子串前面可能的最長串合併。count[i]=count[i-1]+count[i-count[i-1]-2]+2.

-不是合法巢狀,在這個)處,應清零,count[i]=0;

int longestvalidparentheses(string

s)

else count[i]=2

; }

else

else count[i]=count[i-1]+2

; }

else

}longest=max(longest,count[i]);}}

return

longest;

}

1478 括號序列的最長合法子段(模擬棧)

這裡有另乙個關於處理合法的括號序列的問題。如果插入 和 1 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列 和 是合法的,但是 和 是不合法的。這裡有乙個只包含 和 的字串,你需要去找到最長的合法括號子段,同時你要找到擁有最長長度的子段串的個數。輸入第一行...

合法的括號串(C 實訓題,棧)

問題描述 乙個合法的括號串,是指只包含括號的串,如果滿足如下條件 1 這四對括號是合法的 2 如果r是合法括號串,則 r 也是 3 如果r,s是合法括號串,則rs也是 所以 是合法的括號串,而 就不是。輸入形式 輸入第一行正整數t 10 n 100 表示有多少組測試資料。後面有t行,每行乙個只包含8...

資料結構之棧的應用(判斷字串中括號的合法性)

需求 判斷乙個字串中的括號是否成對,是否合法?const str1 3223 2 2 2 const str2 22 12 sf1 sdfs 步驟 1.引入棧結構的建構函式 const stack require stack const str1 3223 2 2 2 const str2 22 1...