开始用vector模拟,用一个迭代器its来保存当前光标位置,写完发现insert可能复杂度有点高还是什么的,tle了。。。
后来用另一个方法,从后往前遍历,用一个数r 来表示每次光标移到前面后再次移动的位置(可能说的不是很清楚,具体看代码吧。。。囧rz)每次碰到'['则输出从'['到r 的字符并标记已经输出过,最后从前往后遍历,顺序输出还未输出过的字符。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 100005; 8 9 int main (){ 10 int visit[maxn]; 11 char str[maxn]; 12 while (gets(str)!=NULL){ 13 int len=strlen(str); 14 memset (visit,0,sizeof visit); 15 int r; 16 r=len; 17 for (int i=len-1;i>=0;i--){ 18 if (str[i]==']') 19 r=i; 20 if (str[i]=='['){ 21 for (int j=i+1;j<r;j++) 22 if (str[j]!='['&&str[j]!=']') 23 printf ("%c",str[j]),visit[j]=1; 24 r=i; 25 } 26 } 27 for (int i=0;i<len;i++) 28 if (!visit[i]&&str[i]!='['&&str[i]!=']') 29 printf ("%c",str[i]); 30 printf (" "); 31 32 } 33 return 0; 34 }
vector的写法也贴一下,虽然TLE 了 囧
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 7 int main (){ 8 vector <char> s(100005); 9 char str[100005]; 10 while (scanf ("%s",str)!=EOF){ 11 s.clear (); 12 vector<char>::iterator its=s.begin() ; 13 int len=strlen(str); 14 for (int i=0;i<len;i++){ 15 if (str[i]=='['){ 16 its=s.begin() ; 17 continue ; 18 } 19 if (str[i]==']'){ 20 its=s.end() ; 21 continue ; 22 } 23 its=s.insert(its,str[i])+1; 24 } 25 for (its=s.begin() ;its!=s.end() ;its++) 26 printf ("%c",*its); 27 printf (" "); 28 } 29 return 0; 30 }