题目描述
- 给一个定长为N的字符串S,构造一个字符串T,长度也为N。起初,T是一个空串,随后反复进行下列任意操作:
- 从S的头部删除一个字符,加到T的尾部
从S的尾部删除一个字符,加到T的尾部 - 目标是最后生成的字符串T的字典序尽可能小
1≤N≤2000
字符串S只包含大写英文字母
输入:字符串S
输出:字符串T
题目解析
- 将输入的字符串倒序,对倒序字符串和源串同时扫描,谁小保存谁,遇到相同的,则比较下一位,直到获取更小一位
代码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
char[] string=new char[N];
for (int i = 0; i < string.length; i++) {
string[i]=scanner.next().charAt(0);
}
solve(string);
}
private static void solve(char[] string) {
StringBuilder sBuilder=new StringBuilder();
StringBuilder sBuilder2=new StringBuilder();
for (int i = 0; i < string.length; i++) {
sBuilder.append(string[i]);
}
char[] stringReverse = sBuilder.reverse().toString().toCharArray();
int j=0,i=0;
while (sBuilder2.length()<string.length) {
if(string[j]<stringReverse[i]) {
sBuilder2.append(string[j]);
j++;
}else if(string[j]==stringReverse[i]){
if(string[j+1]<stringReverse[i+1]) {
sBuilder2.append(string[j]);
j++;
}else {
sBuilder2.append(stringReverse[i]);
i++;
}
}else {
sBuilder2.append(stringReverse[i]);
i++;
}
}
System.out.println(sBuilder2.toString());
}