給乙個只由』(『和』)'組成的字串,找出其中最長的連續合法子串長度。(**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 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列 和 是合法的,但是 和 是不合...