問題の説明
バランスの取れた括弧文字列SSを指定すると、S、次のルールに従って文字列のスコアを計算します。
- ( ) ()( )は1 1を取得します1ポイント;
- AB ABA B得A + BA + Bあ+B分,其中 A A AとBBBはバランスの取れた括弧の文字列です。
- (A) (A)(A) 得 2 ∗ A 2 * A 2∗A 分,其中 A A Aは、バランスの取れた括弧の文字列です。
サンプル入力
例 1:
入力: "()"
出力: 1
例 2:
入力: "(())"
出力: 2
例 3:
入力: "()()"
出力: 2
例 4:
入力: "(()(()))"
出力: 6
コード
方法 1: スタックする
バランスの取れた文字列を null 文字として扱い、ssと入力しますs、ヌル文字の組み合わせが初期スコアとして使用され、最終的なバランスのとれた文字列のスコアが継続的に変換および蓄積されます。
左括弧が見つかった場合は、左括弧がスタックに直接プッシュされ、スコアはそれによって表されます。は 0 にプッシュされます;
右括弧が見つかった場合は、括弧内にバランスの取れた文字列がある可能性があることを表します。この時点で分類が議論されます: スタックの最上位要素が 0 の場合、スタックの最上位要素をポップしますスタックの新しい最上位要素の値を 1 に変更します。それ以外の場合は、スタックの新しい最上位要素の値を 2 倍にして累積します。
class Solution:
def scoreOfParentheses(self, s: str) -> int:
ans=[0]
for letter in s:
if letter=='(':
ans.append(0)
else:
v=ans.pop()
ans[-1]+=max(2*v,1)
return ans[-1]
if __name__ == '__main__':
print(Solution().scoreOfParentheses('()()'))
方法 2: dfs と同様
最も深い括弧のペアに直接移動し、形式( ) ()のみを計算します。( )内の分数は
class Solution:
def scoreOfParentheses(self, s: str) -> int:
ans,deep=0,0
for idx,letter in enumerate(s):
if letter=='(':
deep+=1
else:
deep-=1
if letter==')' and s[idx-1]=='(':
if deep!=0:
ans+=1<<deep
else:
ans+=1
return ans
if __name__ == '__main__':
print(Solution().scoreOfParentheses('(((())))'))