標籤:
題目大意:將一個字串改變順序後輸出。遇到“[”就將後面內容拿到最前面輸出,遇到“]”就將後面的內容拿到最後面輸出。
題目分析:用nxt[i]數組表示i後面的字元的下標,實際上就是以字元i為頭建立鏈表,寫法類似鏈式前向星。
代碼如下:
# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;char p[100005];int nxt[100005],head,rear;int main(){ while(scanf("%s",p+1)!=EOF) { int l=strlen(p+1); head=rear=0; nxt[0]=0; for(int i=1;i<=l;++i){ if(p[i]==‘[‘) head=0; else if(p[i]==‘]‘) head=rear; else{ nxt[i]=nxt[head]; nxt[head]=i; if(head==rear) rear=i; head=i; } } for(int i=nxt[0];i>0;i=nxt[i]) printf("%c",p[i]); puts(""); } return 0;}
這道題還可以用遞迴來解決:
# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;char p[100005];void print(int u){ for(int i=u;i>=0;--i){ if(p[i]==‘[‘){ for(int j=i+1;j<=u;++j) printf("%c",p[j]); print(i-1); break; }else if(p[i]==‘]‘){ print(i-1); for(int j=i+1;j<=u;++j) printf("%c",p[j]); break; } if(i==0){ for(int j=0;j<=u;++j) printf("%c",p[j]); } }}int main(){ while(scanf("%s",p)!=EOF) { int l=strlen(p); print(l-1); printf("\n"); } return 0;}
UVA-11988 Broken Keyboard (a.k.a. Beiju Text) (鏈表 或 遞迴)