数组模拟链表

题目:

 

 分析:

由于字符串长度达到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;
}

 

posted @ 2021-10-26 20:22  yuawang  阅读(135)  评论(0)    收藏  举报