给定一个平衡括号字符串 S
,按下述规则计算该字符串的分数:
()
得 1 分。
AB
得 A + B
分,其中 A 和 B 是平衡括号字符串。
(A)
得 2 * A
分,其中 A 是平衡括号字符串。
示例 1:
示例 2:
示例 3:
示例 4:
提示:
S
是平衡括号字符串,且只含有 (
和 )
。
2 <= S.length <= 50
C++
class Solution {public : int i = 0 ; int scoreOfParentheses (string s) { if (s.size () == 2 ) return 1 ; return dfs (s); } int dfs (string s) { int res = 0 ; while (i < s.size () && s[i] == '(' ){ if (s[++i] == ')' ) res += 1 ; else res += 2 * dfs (s); ++i; } return res; } };
我们通过观察发现,() 是唯一贡献分数的结构,外括号只是为该结构添加了一些乘数。所以我们只需要关心 ()。
我们用 dd 维护当前括号的深度,对于每个 (,我们将深度加一,对于每个 ),我们将深度减一。当我们遇到 () 时,我们将 2^d
加到答案中。
我们举个实际的例子,以 (()(())) 为例,我们首先找到内部两个闭合括号 (),然后将分数加上对应的 2^d
。实际上,我们是在计算 (()) + ((())) 的分数。
( ( ) ( ( ) ) ) ^ ^ ^ ^ ( ( ) ) + ( ( ( ) ) ) ^ ^ ^ ^
class Solution {public : int scoreOfParentheses (string s) { int ans = 0 , d = 0 ; for (int i = 0 ; i < s.size (); ++i) { if (s[i] == '(' ) { ++d; } else { --d; if (s[i - 1 ] == '(' ) { ans += 1 << d; } } } return ans; } };
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))" ,"(()())" ,"(())()" ,"()(())" ,"()()()" ]
示例 2:
提示:
C++ class Solution {public : vector<string> generateParenthesis (int n) { vector<string> res; dfs (res, "" , 0 , 0 , n); return res; } void dfs (vector<string>& res, string path,int l, int r, int n) { if (l < r || l > n || r > n) return ; if (l == r && l == n) res.push_back (path); dfs (res, path + '(' , l + 1 , r ,n); dfs (res, path + ')' , l, r + 1 , n); } };
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
提示:
0 <= s.length <= 3 * 104
s[i]
为 '('
或 ')'
C++ class Solution {public : int res = 0 ; int longestValidParentheses (string s) { int n = s.size (); for (int i = 0 ; i < n; i ++){ if (s[i] == ')' ) continue ; int l = 1 ; int r = 0 ; for (int L = 1 ; L < n - i; L ++){ s[i + L] == '(' ? l ++ : r ++; if (l < r) break ; else if (l == r) res = max (res, L + 1 ); } } return res; } };