Leetcode中括號題

2021-06-22 03:26:15 字數 1692 閱讀 8850

想到括號問題,我最熟悉的是用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 ...