POJ3617 Best Cow Line

xiaoxiao2021-02-28  59

题意:给出一个字符串s,每次从字符串s首部或者尾部取一个字符,拼成新的字符,使得字典序最小。

思路:使用贪心算法 。

(1)如果首部字符小于尾部字符,取首部字符

(2)如果首部字符大于尾部字符,取尾部字符

(3)如果首部字符等于尾部字符,取首部或者尾部都可以

代码如下:

import java.io.*; import java.util.Scanner; class Solution { public static String solve(String s) { int start = 0, end = s.length() - 1; StringBuilder sb = new StringBuilder(); while (start <= end) { boolean left = false; for (int i = 0; i + start <= end; i++) { if (s.charAt(start + i) < s.charAt(end - i)) { left = true; break; } else if (s.charAt(start + i) > s.charAt(end - i)) { left = false; break; } } if (left) { sb.append(s.charAt(start++)); } else { sb.append(s.charAt(end--)); } } return sb.toString(); } } class MySystem { private static Scanner cin; private static PrintWriter cout; private final static boolean DEBUG = false; private MySystem(){} static { init(); } private static void init() { try { if (DEBUG) { cin = new Scanner(new BufferedInputStream(new FileInputStream("d:\\program\\intelj\\spoj\\src\\spoj.txt"))); } else { cin = new Scanner(new BufferedInputStream(System.in)); } cout = new PrintWriter(new BufferedOutputStream(System.out)); } catch (IOException e) { e.printStackTrace(); } } public static Scanner getInput() { return cin; } public static PrintWriter getOutput() { return cout; } } public class Main { public static void main(String[] args) { Scanner cin = MySystem.getInput(); PrintWriter cout = MySystem.getOutput(); while (cin.hasNext()) { int n = cin.nextInt(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) { sb.append(cin.next()); } String ans = Solution.solve(sb.toString()); int limit = 80; int lines = (ans.length() + limit - 1)/ limit; for (int i = 0; i < lines; i++) { if (i != lines - 1) cout.println(ans.substring(i * limit, (i + 1) * limit)); else cout.print(ans.substring(i * limit)); } cout.flush(); } } }

转载请注明原文地址: https://www.6miu.com/read-66458.html

最新回复(0)