字典序最小问题
/*
字典序最小问题
给一个定长为N的字符串S,构造一个字符串T,长度也为N。
起初,T是一个空串,随后反复进行下列任意操作
- 从S的头部删除一个字符,加到T的尾部
- 从S的尾部删除一个字符,加到T的尾部
目标是最后生成的字符串T的字典序尽可能小
1≤N≤2000
字符串S只包含大写英文字母
输入:字符串S 6 A C D B C B
输出:字符串T ABCBCD
POJ - 3617 要求每80个字符换行输出
*/
package _90贪心;
import java.util.Scanner;
public class 字典序最小 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
StringBuilder sc=new StringBuilder();
int n=in.nextInt();//输入字典数长度
for(int i=0;i<n;i++) {
sc.append(in.next());//添加入
}
String s=sc.toString();//转化为字符串
// String s1=in.nextLine();
f(s);
}
private static void f(String s1) {
// TODO Auto-generated method stub//要建立StringBuilder才能翻转
String s2=new StringBuilder(s1).reverse().toString();//先翻转然后转化为字符串
int n=s1.length();
StringBuilder xin=new StringBuilder();//建立新字符对象,存储结果
while(xin.length()<n) {//不能超出长度
if(s1.compareTo(s2)<=0) {//s与ss比较 小于0的就运行
xin.append(s1.charAt(0));//添入
s1=s1.substring(1);//删头
}else {
xin.append(s2.charAt(0));//添入
s2=s2.substring(1);//删头
}
}
System.out.println(xin.toString());//输出
}
}
/*
//字符满80个就换行
if (rs.length() % 80 == 0) {
System.out.println(rs.substring(cnt * 80, (cnt + 1) * 80));
cnt++;
}
}
//余数部分
if (rs.length() > cnt * 80) {
System.out.println(rs.substring(cnt * 80));*/