UVA-11988 Broken Keyboard (a.k.a. Beiju Text) (链表 或 递归)
题目大意:将一个字符串改变顺序后输出。遇到“[”就将后面内容拿到最前面输出,遇到“]”就将后面的内容拿到最后面输出。
题目分析:用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; }