問題:
難易度:中
説明:
「(」と「)」のみの文字配列が与えられた場合、ルールは次のようになります。
1.2文字連続 "(" ")" [つまり "()"]の場合、1ポイントがカウントされます
2.次に、「(())」が含まれている場合、スコアは1 * 2であり、「((()))」が含まれている場合、1 * 2 * 2であり、括弧には内側の括弧と内側のスコアは* 2です
3。()()の場合、1 +1個の隣接する直接分数を追加します
件名リンク:https://leetcode.com/problems/score-of-parentheses/submissions/
入力範囲:
S
とのみ(
を 含む、バランスの取れた括弧文字列)
です。2 <= S.length <= 50
题目一定会返回有匹配的括号组合不会突然出现只有 "(" 或者 ")" 得不到组合的数据
ケースを入力してください:
Example 1:
Input: "()"
Output: 1
Example 2:
Input: "(())"
Output: 2
Example 3:
Input: "()()"
Output: 2
Example 4:
Input: "(()(()))"
Output: 6
私のコード:
一見スタック処理の方が適切だと感じます。まずブラケットマッチングを行い、1点に直接隣接していることを確認し、展開すると※2になります。ただし、コードの記述については別途説明します。
これは内側から括弧と一致する必要があることを考慮する必要があるため、括弧スコアと括弧を一致させた後、単純に処理します。
例:((())())->((1)1)->(21)->(3)-> 6、自分で感じてください
Java:
class Solution {
public int scoreOfParentheses(String S) {
char[] chs = S.toCharArray();
int len = S.length(), top = -1;
int[] stack = new int[len + 2 >> 1]; // 使用 栈 计分,长度只需要一半 + 1 就行
for(int i = 0; i < len; i ++) {
char ch = chs[i];
if(ch == '(') stack[++ top] = -1; // 如果是 ( 就直接标记为 -1,不直接加分
else {
if(stack[top] == -1) stack[top] = 1; // 如果 ( 直接遇到 ) 计 1 分,直接放到栈顶
else {
int temp = 0; // 如果不是就进行累加
while(top >= 0 && stack[top] != -1) temp += stack[top --];
stack[top] = temp << 1; // 放回栈顶
}
}
}
for(int i = 1; i <= top; i ++) stack[0] += stack[i]; // 最后累计
return stack[0];
}
}
C ++:
class Solution {
public:
int scoreOfParentheses(string S) {
int len = S.size(), top = -1, *stack = new int[(len + 2) >> 1];
for(int i = 0; i < len; i ++) {
if(S[i] == '(') stack[++top] = -1;
else {
if(stack[top] == -1) stack[top] = 1;
else {
int temp = 0;
while(top >= 0 && stack[top] != -1) temp += stack[top --];
stack[top] = temp << 1;
}
}
}
for(int i = 1; i <= top; i ++) stack[0] += stack[i];
return stack[0];
}
};