最小字符串

来源:互联网 发布:mac安装win7激活 编辑:程序博客网 时间:2024/05/11 19:37

给定长度为 N 的字符串 S,现在要构造一个长度为 N 的字符串 TT 开始的时候是空串,然后反复进行以下两个操作之一,直至 S 为空串:

  1. 从 S 的头部删除一个字符,加到 T 的尾部
  2. 从 S 的尾部删除一个字符,加到 T 的尾部

求字典序尽可能小的字符串 T

输入格式

一个整数 T,表示有多少组测试数据。

接下来的 T 组测试数据,每组测试数据第一行是一个正整数 N (0 <= N <= 2000),表示字符串的长度。
第二行是一个长度为 N 的字符串 S

保证字符串出现的字符都是可打印字符。

输出格式

输出一个字符串,表示题目要求的字符串 T

样例输入

16ACDBCB

样例输出

ABCBCD
方法1,本人写的
#include<stdio.h>#define MAX 2000void getOneTest(){int N,i,j,oi;char input[MAX],  output[MAX];scanf("%d",&N);getchar();for(i=0;i<N;i++)input[i]=getchar();i=0;j=N-1;oi=0;while(i<=j){if(input[i]<input[j]){//printf("%d:%c<%d:%c\n",i,input[i],j,input[j]);output[oi++]=input[i++];}else if((input[i]>input[j])){//printf("%d:%c<%d:%c\n",j,input[j],i,input[i]);output[oi++]=input[j--];}else{int count=0;while(input[i]==input[j] &&i<j) //谁先找到最小的下标,就先将谁添加到output后面{//printf("%d:%c=%d:%c\n",i,input[i],j,input[j]);count++;i++;j--;}if(input[i]<=input[j]){//printf("%d:%c<=%d:%c\n",i,input[i],j,input[j]);j=j+count;i=i-count;output[oi++]=input[i++];}else if((input[i]>input[j])){//printf("%d:%c<%d:%c\n",j,input[j],i,input[i]);j=j+count;i=i-count;output[oi++]=input[j--];}}}output[oi]='\0';printf("%s\n",output);}int main(){int T;scanf("%d",&T);getchar();while(T--)getOneTest();}

改进版:
#include<stdio.h>#define MAX 2000void getOneTest(){int N,i,j,oi;char input[MAX],  output[MAX];scanf("%d",&N);getchar();for(i=0;i<N;i++)input[i]=getchar();i=0;j=N-1;oi=0;while(i<=j){if(input[i]<input[j])output[oi++]=input[i++];else if((input[i]>input[j]))output[oi++]=input[j--];else{int tmpI=i, tempJ=j;bool flag=0;while(input[tmpI]==input[tempJ] &&tmpI<tempJ) //谁先找到最小的下标,就先将谁添加到output后面{//printf("%d:%c=%d:%c\n",i,input[i],j,input[j]);tmpI++;tempJ--;}flag=(input[i]<=input[j]);if(flag)output[oi++]=input[i++];elseoutput[oi++]=input[j--];}}output[oi]='\0';printf("%s\n",output);}int main(){int T;scanf("%d",&T);getchar();while(T--)getOneTest();}


0 0