最長合法括號

2021-08-28 09:03:59 字數 3174 閱讀 7548

給乙個只由』(『和』)'組成的字串,找出其中最長的連續合法子串長度。(**leetcode)

input:(()

output:2

input: )()())

output: 4

input: ((())

output: 4

很明顯,可以用動態規劃,我也是這麼想的。

構建dp[len][len], dp[i][j]表示以i開頭,j結尾的子串中最長子串。s表示字串,然後給出遞推式

d p[

i][j

]=

2, & \text\\ dp[i+1][j-1] + 2, & \text\\ dp[k+1][j] + dp[i][k], & \text k \in (i, j)\\ \end

dp[i][

j]=⎩

⎪⎨⎪⎧

​2,d

p[i+

1][j

−1]+

2,dp

[k+1

][j]

+dp[

i][k

],​if i+1 = j and s[i] = 』(』 and s[j] = 』)』

if dp[i+1][j-1] > 0 and s[i] = 』(』 and s[j] = 』)』

if dp[i][k] > 0 and dp[k+1][j] > 0, k∈

(i,j

)​注意,迴圈的時候注意i∈(

len,

0],j

∈[i+

1,le

n),k

∈(i,

j)

i \in (len, 0], j \in[i+1, len), k \in (i, j)

i∈(len

,0],

j∈[i

+1,l

en),

k∈(i

,j)

class solution }}

if(max < dp[i][j])

max = dp[i][j];}}

return max;

}};

結果分析,雖說用了動態規劃的思想,但是明顯時間和空間複雜度過高,儘管有一定技巧性,但本質上是o(n

3),o

(n2)

o(n^3), o(n^2)

o(n3),

o(n2

), 還不如暴力搜尋,至少暴力搜尋的空間複雜度是o(n

)o(n)

o(n)

。找出所有偶數子串,然後使用堆疊判斷是否是合法括號。

時間複雜度和空間複雜度為o(n

3),o

(n

)o(n^3), o(n)

o(n3),

o(n)

public class solution  else if (!stack.empty() && stack.peek() == '(')  else 

}return stack.empty();

}public int longestvalidparentheses(string s) }}

return maxlen;

}}

只需乙個一維動態陣列,dp[i]表示,以第i個字元結尾的合法子串長度。換句話說,合法子串包括第i個字元。時間複雜度和空間複雜度分別為o(n

),o(

n)

o(n), o(n)

o(n),o

(n)。下面給出遞推式

d p[

i]

=dp[i-2] + 2, & \text\\ dp[i-1] + dp[i - dp[i-1] - 2] + 2, & \text\\ 0, & \text\\ \end

dp[i]=

⎩⎪⎨⎪

⎧​dp

[i−2

]+2,

dp[i

−1]+

dp[i

−dp[

i−1]

−2]+

2,0,

​if i is even and s[i-1] = 』(』 and s[i] = 』)』

if i is even and s[i-1] = 』)』 and s[i] = 』)』 and s[i−dp[i−1]−1]=』(』

others

public class solution  else if (i - dp[i - 1] > 0 && s.charat(i - dp[i - 1] - 1) == '(') 

maxans = math.max(maxans, dp[i]);}}

return maxans;

}}

新建乙個stack,

壓入 -1;

對每個字元,如果是』(』,壓入該索引,

如果是』)』, 彈出棧頂元素,此時用該索引,減去彈出元素之後的棧頂元素,即為當前合法子串長度。如果棧為空,則將』)'的索引壓入棧中。

該演算法的時間複雜度和空間複雜度為o(n

),o(

n)

o(n), o(n)

o(n),o

(n)

public class solution  else  else }}

return maxans;

}}

用兩個變數left和right儲存左右括號數量,當left == right,表示當前最大子串長度,當right > left,表示遇到不合法,兩個變數置0。當遇到"(()",此時該方法失效,因此從左往右掃,然後從右往左掃,即可完美解決所有情況。

該演算法的時間複雜度和空間複雜度為o(n

),o(

1)

o(n), o(1)

o(n),o

(1)

public class solution  else 

if (left == right) else if (right >= left)

}left = right = 0;

for (int i = s.length() - 1; i >= 0; i--) else

if (left == right) else if (left >= right)

}return maxlength;

}}

最長合法括號序列

description 如果乙個括號序列插入 和 1 後,可以得到乙個正確的數學表示式,那麼它被稱為 合法 的。例如,序列 和 是合法的,但 和 不是合法的。給出乙個由 和 字元組成的字串 你要找出它最長的是合法括號序列的子串,也同樣要找出最長子串的個數。100 的資料 讀入的字串長度小於 等於10...

最長合法括號序列 棧(括號題)

這是另一道處理合法括號序列的題目。我們應該提醒你,如果乙個括號序列插入 和 1 後,可以得到乙個正 確的數學表示式,那麼它被稱為 合法 的。例如,序列 和 是合法的,但 和 不是。給出乙個由 和 字元組成的字串。你要找出它最長的是合法括號序列的子串,也同樣要找出最長子串的個數。括號題容易想到棧,把左...

1478 括號序列的最長合法子段

1478 括號序列的最長合法子段 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 這裡有另乙個關於處理合法的括號序列的問題。如果插入 和 1 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列 和 是合法的,但是 和 是不合...