数组模拟链表
题目:

分析:
由于字符串长度达到10的5次方,操作设计频繁插入,所以用普通的数组遍历肯定会超时。
解决方法是用链表,这里用数组模拟链表。注意模拟两个字,这就要联想到指针链表是怎么实现的了,清楚原理后,用数组模拟就不难了。
我们用next数组来模拟链表,next[i]代表字符串数组第i元素的下一个元素的坐标。这里的关键是找到当前元素要插入的位置,我们用t变量来维护。为了方便我们输入字符串从第一个位置开始输入,next[0]作为头节点,当出现字符‘[’时t=0;当出现字符‘]’时,t=tail,tail为当前字符串的尾部。
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<set> #include<map> #include<vector> #include<queue> #include<stack> #include<utility> #include<unordered_map> using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn=100000+5; const int inf=0x3f3f3f3f; const int mod = 1e9+7; char s[maxn]; int nxt[maxn]; int main() { while(scanf("%s",s+1)!=EOF){ nxt[0]=-1; int n=strlen(s+1); int t=0,tail=0;//printf("%d\n",strlen) for(int i=1;i<=n;i++){ if(s[i]=='[')t=0; else if(s[i]==']')t=tail; else{ int p=nxt[t]; nxt[t]=i; nxt[i]=p; if(t==tail)tail=i; t=i; } } t=0; while(nxt[t]!=-1){ printf("%c",s[nxt[t]]); t=nxt[t]; } printf("\n"); } return 0; }

浙公网安备 33010602011771号