/* * Author: Yang Pei * Problem: Text Justification * Source: https://oj.leetcode.com/problems/text-justification/ * * Note: * Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified. * You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactly L characters. * Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right. * For the last line of text, it should be left justified and no extra space is inserted between words. * * For example, * words: ["This", "is", "an", "example", "of", "text", "justification."] * L: 16. * * Return the formatted lines as: * [ * "This is an", * "example of text", * "justification. * ] * Note: Each word is guaranteed not to exceed L in length. * * Solution: * Use one function to determine the words, use one function to make the line. * * Corner case: * The last line and the line with only one words, we should left-justified. */ import java.util.*; public class TextJustification { private int wordCount(String[] words, int beg, int L) { // return the first of next line's word's index int count = 0; int i = beg; for(i = beg; i < words.length; i++) { count = count + words[i].length(); if(count > L) break; count = count + 1; } return i; } private String newLine(String[] words, int beg, int end, int L) { int count = 0; for(int i = beg; i < end; i++) count = count + words[i].length(); int number = end - beg; int blank = number == 1 ? ((L - count) / (number - 1)) : L - count; int extra = number == 1 ? ((L - count) % (number - 1)) : 0; String bl = ""; for(int i = 0; i < blank; i++) bl = bl + " "; StringBuffer line = new StringBuffer(); for(int i = beg; i < end; i++) { line.append(words[i]); if(beg != i && i == end - 1) break; line.append(bl); if(extra > 0) { line.append(" "); extra--; } } return line.toString(); } private String lastLine(String[] words, int beg, int L) { StringBuffer line = new StringBuffer(); for(int i = beg; i < words.length; i++) { line.append(words[i]); if(i != words.length - 1) line.append(" "); } int blank = L - line.length(); for(int i = 0; i < blank; i++) line.append(" "); return line.toString(); } public List<String> fullJustify(String[] words, int L) { int ind = 0; List<String> result = new ArrayList<String>(); while(ind < words.length) { int beg = ind; ind = wordCount(words, beg, L); if(ind == words.length) result.add(lastLine(words, beg, L)); else result.add(newLine(words, beg, ind, L)); } return result; } }
2014年12月28日星期日
[Leetcode] Text Justification
The code is also available here https://gist.github.com/pyemma/b8b0f771085823ec4b87
订阅:
博文评论 (Atom)
没有评论:
发表评论