来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给定长度为N的字符串S,要构造一个长度为N的字符串T。T初始是空字符串。S由大写字母构成。
构造过程通过反复进行以下任意操作:
从S的头部删除一个字符,添加到T的尾部
从S的尾部删除一个字符,添加到T的尾部
请你构造出字典序尽可能小的字符串T(字典序是指首先比较第一个字符,如果不同则第一个字符
较小的字符串更小,如果相同则比较第二个字符,以此类推)
输入描述:
第一行一个整数N,表示字符串的长度(1<=n<=2000) 第二行输入一个长度为N的字符串S
输出描述:
输出构造出的尽可能小的字符串T
示例1
输入
6
ACDBCB
输出
ABCBCD
思路:
主要判断两边相等的情况,每次判断输出左指针还是右指针即可;若两边不同,输出字典序小的;若相同,则继续往中间找(此过程不能移动两边指针的位置),直到遇到不同字符再判断输出哪一个;
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
int n;
string s;
cin >> n >> s;
int left = 0,right = n - 1;//一个左指针,一个右指针;
int flag;
flag = 0;
int i;
while(left <= right)
{
flag = 0;
for(i = 0;left + i < right;i ++)
{
if(s[left + i] < s[right - i])
{
flag = 1;//左边字母小,flag赋1;
break;
}
else if(s[left + i] > s[right - i])
{
flag = 0;//右边字母小,flag赋0;
break;
}
}
if(flag == 1)
{
cout << s[left];
left ++; //++让左指针向右扫描;
}
else
{
cout << s[right];//--让右指针向左扫描;
right --;
}
}
return 0;
}