8.7贪心策略例题:字典序最小问题

字典序最小问题:
给一个定长为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 }
原文地址:https://www.cnblogs.com/z1110/p/12769701.html