第一次做链表的题,理解了好一会儿才明白next数组的工作原理。在本题中,首先将输入数据保存在字符数组s中。next[i]表示的是在屏幕上显示时,s[i]字符的下一个字符在s串中的下标。用cur模拟当前鼠标指针的位置,表示指针在字符s[cur]之后。为了方便顺序输出字符,需要一个索引next[0]来标记字符串的起始位置。因为原光标之后的字符的前一个字符变成了s[i],那么s[i]的下一个字符应为s[cur],即next[i]=next[cur];当字符s[i]插入cur位置以后,s[cur]字符以后的字符就变为了s[i],那么令next[cur]=i。如果还不明白的话,可以看下面的图。![这里写图片描述](https://img-blog.csdn.net/20170913004621878?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzg0ODU3NDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ac代码如下
#include<bits/stdc++.h>
using namespace std;
char s[100050];
int nxt[100005];
int main()
{
while (scanf("%s", s+1) == 1) {
memset(nxt, 0, sizeof(nxt));
int len = strlen(s + 1);
int cur = 0, endd = 0;
for (int i = 1; i <= len; i++) {
if (s[i] == '[')cur = 0;
else if (s[i] == ']')cur = endd;
else {
nxt[i] = nxt[cur];//原来位于cur位置的字符接到s[i]后面
nxt[cur] = i;//位于光标位置的字符进行更新
if (cur == endd)endd = i;//如果在链表末尾进行写入,那么链表尾部的是第i个字符
cur = i;//更新当前光标
}
}
for (int i = nxt[0]; i; i = nxt[i]) {
printf("%c", s[i]);
}
printf("\n");
}
}