码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-24 20:18:35      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:eve   一个   tin   大于   技术   换行   字符串   compare   要求   

字典序最小问题:
给一个定长为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贪心策略例题:字典序最小问题

标签:eve   一个   tin   大于   技术   换行   字符串   compare   要求   

原文地址:https://www.cnblogs.com/z1110/p/12769701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!