例题6-4 破损的键盘 UVa 11988

来源:互联网 发布:pscc是什么软件 编辑:程序博客网 时间:2024/05/01 13:23

题意:字符'['表示句首,就是光标移到了句首,’】‘表示句尾

法一:用链表模拟光标移动

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int maxn=100005;int last,cur,next[maxn];char s[maxn];int main(){    //freopen("f.txt","r",stdin);    while(scanf("%s",s+1)==1){        int n=strlen(s+1);        last=cur=0;        next[0]=0;        for(int i=1;i<=n;i++){            char ch=s[i];            if(ch=='[')cur=0;            else if(ch==']')cur=last;            else{                next[i]=next[cur];                next[cur]=i;                if(cur==last)last=i;                cur=i;            }        }        for(int i=next[0];i!=0;i=next[i]){            printf("%C",s[i]);        }        printf("\n");    }    return 0;}

法二:这题看到有人用双端队列,把[加入队首,】加入队尾,再按照队列中的顺序输出

#include <iostream>#include <string>#include <vector>#include <cstdio>#include <deque>using namespace std;char str[100010];int main(){   // freopen("f.txt","r",stdin);    while(scanf("%s",str)!=EOF){        deque<int > q;        int i=0;        while(str[i]=='['||str[i]==']')  i++;        q.push_front(i);        while(str[i]){            if(str[i]=='['){                 q.push_front(i+1);                 str[i]='\0';            }            else if(str[i]==']'){                 q.push_back(i+1);                 str[i]='\0';            }            i++;        }        while(!q.empty()){            printf("%s",str+q.front());            q.pop_front();        }        printf("\n");    }    return 0;}

法三:

分析:给出的一行文本,从后往前看,如果遇到】,那么】后面的字符串一定在最后,后面的字符串一定在最前,再往前移动还是这样的规律,所以这题可以用递归解决;

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;char buf[100001];void dfs(int l, int r){int s = r;while (s >= l && buf[s] != '[' && buf[s] != ']') s --;if (buf[s] == ']') dfs(l, s-1);for (int i = s+1 ; i <= r ; ++ i)printf("%c",buf[i]);if (buf[s] == '[') dfs(l, s-1);}int main(){   // freopen("f.txt","r",stdin);while (gets(buf)) {dfs(0, strlen(buf)-1);printf("\n");}    return 0;}


0 0
原创粉丝点击