想到括號問題,我最熟悉的是用stack來判斷乙個括號序列是否為valid。沒錯,這就是我對括號題,最初的認識。
題目一:valid parentheses
given a string containing just the characters '(', ')', '', '[' and ']', determine if the input string is valid.
思路:利用棧存最近訪問的括號,如果遇到右括號,則到了judge時候。
class solution
void generateparenthesis(vector& res, string s, int left, int right, int n, int lev)
if(left) generateparenthesis(res, s+'(', left-1, right, n, lev+1);
if(right>left && right) generateparenthesis(res, s+')', left, right-1, n, lev+1);
}};
前面兩道都算是水題,下面這個題個人覺得比較難。需要動點腦筋。不是簡單遞迴下或者stack遍歷下就能解決的。
題目三:longest valid parentheses
given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
思路:我在這道題上犯二逼了,老是想著stack遍歷,祈求能統計得到聯絡合理的括號對,但是老嘗試失敗,還折騰了一下午。。。後來,discussion裡的小夥伴又拯救了我。從另乙個思路出發,用stack存左括號,嚴格來說只存為匹配上的左括號(好像和stack遍歷也沒啥區別,到這裡)。不同的是,這個stack不再是單純存括號本身,而是存括號的index,可以通過index得到substring的長度(這應該是一種很普通的想法,可我咋就是沒想到,豬~)
class solution {
public:
int longestvalidparentheses(string s) {
stackpstack; //棧存放unmatched左括號
int n=s.length();
if(n==0 || n==1) return 0;
int maxcount=0;
int lastofleft=0;
for(int i=0; i
也有其他小夥伴提出一種dp的解決方法,個人覺得不算是很大眾的解法。這裡也貼出來。利用動態規劃的思想,用一維數值dp儲存i到s末尾最大有效括號的長度
class solution {
public:
int longestvalidparentheses(string s) {
//利用動態規劃的思想,用一維數值dp儲存i到s末尾最大有效括號的長度
int n=s.length();
vectordp(n, 0);
int maxcount=0;
for(int i=n-2; i>=0; i--){ //倒序更新dp的值
if(s[i]=='('){
int j=i+1+dp[i+1]; //上個未匹配到的位置
if(j
Leetcode刷題之括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...
LeetCode初級題 有效的括號
有效的括號 題目要求 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 fals...
leetcode刷題(51) 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 思路 只要有左括號就可以新增 class solution public void helper int left,int right,string str if left 0 ...