comments | difficulty | edit_url | tags | ||
---|---|---|---|---|---|
true |
Medium |
|
Given a balanced parentheses string s
, return the score of the string.
The score of a balanced parentheses string is based on the following rule:
"()"
has score1
.AB
has scoreA + B
, whereA
andB
are balanced parentheses strings.(A)
has score2 * A
, whereA
is a balanced parentheses string.
Example 1:
Input: s = "()" Output: 1
Example 2:
Input: s = "(())" Output: 2
Example 3:
Input: s = "()()" Output: 2
Constraints:
2 <= s.length <= 50
s
consists of only'('
and')'
.s
is a balanced parentheses string.
By observing, we find that ()
is the only structure that contributes to the score, and the outer parentheses just add some multipliers to this structure. So, we only need to focus on ()
.
We use (
, we increase the depth by one, and for each )
, we decrease the depth by one. When we encounter ()
, we add
Let's take (()(()))
as an example. We first find the two closed parentheses ()
inside, and then add the corresponding (()) + ((()))
.
( ( ) ( ( ) ) )
^ ^ ^ ^
( ( ) ) + ( ( ( ) ) )
^ ^ ^ ^
The time complexity is
Related problems about parentheses:
- 678. Valid Parenthesis String
- 1021. Remove Outermost Parentheses
- 1096. Brace Expansion II
- 1249. Minimum Remove to Make Valid Parentheses
- 1541. Minimum Insertions to Balance a Parentheses String
- 2116. Check if a Parentheses String Can Be Valid
class Solution:
def scoreOfParentheses(self, s: str) -> int:
ans = d = 0
for i, c in enumerate(s):
if c == '(':
d += 1
else:
d -= 1
if s[i - 1] == '(':
ans += 1 << d
return ans
class Solution {
public int scoreOfParentheses(String s) {
int ans = 0, d = 0;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '(') {
++d;
} else {
--d;
if (s.charAt(i - 1) == '(') {
ans += 1 << d;
}
}
}
return ans;
}
}
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;
}
};
func scoreOfParentheses(s string) int {
ans, d := 0, 0
for i, c := range s {
if c == '(' {
d++
} else {
d--
if s[i-1] == '(' {
ans += 1 << d
}
}
}
return ans
}