소문자와 대괄호로 구성된 문자열이 있다고 가정합니다. 가장 안쪽부터 시작하여 일치하는 각 괄호 쌍의 문자열을 반대로 해야 합니다. 결과에는 대괄호가 포함되어서는 안 됩니다. 따라서 입력이 "(hel(lowo)rld)"와 같으면 출력은 "dlrlowoleh"이므로 처음부터 "(hel(lowo)rld)" → "(helowolrld)"와 같이 변경됩니다. → "드로올레".
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n :=문자열의 크기, 길이가 n인 par라는 배열을 만들고 스택을 정의합니다. st
-
0 ~ n – 1 범위의 i에 대해
-
s[i]가 괄호를 여는 경우 st
에 i를 삽입합니다. -
그렇지 않으면 s[i]가 괄호를 닫을 때 j :=st.pop(), par[i] :=j 및 par[j] :=i
-
-
하나의 빈 문자열 정의 ret
-
for i :=0, d :=1, i
증가 -
s[i]가 여는 괄호이거나 s[i]가 닫는 괄호이면 i :=par[i], d :=-d 그렇지 않으면 s[i]만큼 ret를 증가시킵니다.
-
-
리턴 렛
예시(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: void out(vector <int>& v){ for(int i = 0; i < v.size(); i++){ cout << v[i] << " " ; } cout << endl; } string reverseParentheses(string s) { int n = s.size(); vector <int> par(n); stack <int> st; for(int i = 0; i < n; i++){ if(s[i] == '('){ st.push(i); } else if(s[i] == ')'){ int j = st.top(); st.pop(); par[i] = j; par[j] = i; } } string ret = ""; for(int i = 0, d = 1; i < n; i += d){ if(s[i] == '(' || s[i] == ')'){ i = par[i]; d = -d; } else{ ret += s[i]; } } out(par); return ret; } }; main(){ Solution ob; cout << (ob.reverseParentheses("(hel(lowo)rld)")); }
입력
"(hel(lowo)rld)"
출력
13 0 0 0 9 0 0 0 0 4 0 0 0 0 dlrlowoleh