本以為是個簡單的水題,好吧,其實就是個水題,雖然我還是……
題意的理解上有一點小小的問題orz,這里的括號里的字母是可以看成一個整體的,可以看作一個字母來進行反轉,
比如說,(abc(de)),反轉后應該是((de)cba),所以左邊找括號右邊找括號+反轉/不反轉括號內的數,O(n)的那種想法是不可行的
(怎么感覺可能也就我這么zz發現不了不可行了……)
這里正確的解法是DFS+括號匹配,直接貼代碼吧,不是什么特別難以理解的問題
#include<bits/stdc++.h> using namespace std; const int MAX=5e6+5; string s; int pos[MAX],L[MAX],R[MAX]; void dfs(int l,int r,int flag) {if(!flag) //第偶數個括號內,不反轉,正向輸出 {for(int i=l;i<=r;i++){if(s[i]!='(')cout<<s[i];else //碰到第奇數個括號,更新輸出區間范圍為下一個括號內的字符串位置{dfs(i+1,R[i]-1,1);i=R[i];}}}else //第奇數個括號內,反轉,逆向輸出 {for(int i=r;i>=l;i--){if(s[i]!=')')cout<<s[i];else //碰到第偶數個括號{dfs(L[i]+1,i-1,0);i=L[i];}}} } int main() {cin>>s;int cnt=0;for(int i=0;i<s.length();i++){if(s[i]=='(')pos[++cnt]=i; //用一個棧來記錄括號的位置else if(s[i]==')'){R[pos[cnt]]=i; //對左右括號的位置進行匹配L[i]=pos[cnt--];}}dfs(0,s.length()-1,0);return 0; }
?