字典序最小问题:
给一个定长为N的字符串S,构造一个字符串T,长度也为N。
起初,T是一个空串,随后反复进行下列任意操作
1. 从S的头部删除一个字符,加到T的尾部
2. 从S的尾部删除一个字符,加到T的尾部
目标是最后生成的字符串T的字典序尽可能小
1≤N≤2000
字符串S只包含大写英文字母
输入:字符串S
输出:字符串T
POJ - 3617 要求每80个字符换行输出
思路:
用StringBuilder接收字符串s,在用String s1接收一个翻转字符串后的s。
s和s1的首字符不断比较大小,谁大就把当前首字符添加到T中,并且当前的字符串等于第二个字符开始到结尾的所有字符,直到T的长度大于s的长度就退出循环。
注意每行80个字符,循环里要计数。
1 import java.util.Scanner; 2 3 public class Eight_7贪心策略例题_字典序最小问题 { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 int N = in.nextInt(); 7 StringBuilder s = new StringBuilder(); 8 for(int i = 0; i < N; i++){ 9 s.append(in.next()); 10 } 11 f(s.toString()); 12 } 13 14 private static void f(String s) { 15 String s1 = new StringBuilder(s).reverse().toString(); 16 int N = s.length(); 17 StringBuilder t = new StringBuilder(); 18 int cnt = 0; 19 while(t.length() < N){ 20 if(s.compareTo(s1) <= 0){ 21 t.append(s.charAt(0)); 22 s = s.substring(1); 23 }else{ 24 t.append(s1.charAt(0)); 25 s1 = s1.substring(1); 26 } 27 //字符满80个就换行 28 if(t.length()%80 == 0){ 29 System.out.println(t.substring((cnt*80),(cnt+1)*80)); 30 cnt++; 31 } 32 } 33 //打印剩余不足以80的字符 34 if(t.length() > cnt*80){ 35 System.out.println(s.substring(cnt*80)); 36 } 37 } 38 }