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

Posted z1110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于8.7贪心策略例题:字典序最小问题的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 980 并查集/模拟贪心最小字典序

BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心字典序最小

最小字典序问题java版

力扣 第314场周赛 6202. 使用机器人打印字典序最小的字符串难度:中等(栈+贪心)

Codeforces 1281B - Azamon Web Services (贪心)

算法初级面试题07——前缀树应用介绍和证明贪心策略拼接字符串得到最低字典序切金条问题项目收益最大化问题随时取中位数宣讲会安排