균형 잡힌 괄호 문자열 S가 있다고 가정하고 다음 규칙에 따라 문자열의 점수를 계산해야 합니다. -
- ()의 점수는 1입니다.
- AB의 점수는 A + B이며, 여기서 A와 B는 균형이 잡힌 두 개의 괄호 문자열입니다.
- (A) 점수는 2 * A이며, 여기서 A는 균형 잡힌 괄호 문자열입니다.
따라서 입력이 "(()(()))"와 같으면 출력은 6이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ans :=0, 스택 st 정의
- 0 범위에서 문자열 S
- 의 크기에 있는 i의 경우
- S[i]가 괄호를 여는 경우 스택에 -1을 삽입합니다.
- 그렇지 않으면
- 스택의 맨 위가 -1이면 스택에서 삭제하고 1을 스택에 삽입
- 그렇지 않으면
- x :=0
- 스택의 맨 위가 -1이 아닌 동안
- x를 st만큼 증가, st에서 삭제
- x :=x * 2
- st에서 삭제하고 x 삽입
- 스택이 비어 있지 않은 동안
- st의 맨 위로 증가하고 맨 위 요소 삭제
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int scoreOfParentheses(string S) {
int ans = 0;
stack <int> st;
for(int i = 0; i < S.size(); i+=1){
if(S[i] == '('){
st.push(-1);
}else{
if(st.top() == -1){
st.pop();
st.push(1);
}else{
int x = 0;
while(st.top() != -1){
x += st.top();
st.pop();
}
x *= 2;
st.pop();
st.push(x);
}
}
}
while(!st.empty()){
ans += st.top();
st.pop();
}
return ans;
}
};
main(){
Solution ob;
cout << (ob.scoreOfParentheses("(()(()))"));
} 입력
"(()(()))"
출력
6