Text Justification

Text Justification

  • 没有太多的算法,就是考察各种edge case

  • 需要考虑全面各种情况

  • 如果是普通的line,则需要full justify

  • 如果是 lastLine, 则需要left justify, 并且每一个word直接只能有one space

  • 这题为了写出clean code还可以多写sub method

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> res = new ArrayList<>();
        int n = words.length;
        int start = 0;
        while (start < n) {
            int end = findEnd(words, start, maxWidth);
            res.add(justify(words, start, end, maxWidth));
            start = end + 1;
        }
        return res;
    }
    
    private int findEnd(String[] words, int start, int maxWidth) {
        int n = words.length;
        int end = start, width = words[end++].length();
        while (end < n && width + 1 + words[end].length() <= maxWidth) {
            width += words[end].length() + 1;
            end++;
        }
        return end - 1;
    }
    private String justify(String[] words, int start, int end, int maxWidth) {
        if (start == end) {
            return padRight(words[start], maxWidth);
        }
        boolean lastLine = end == words.length - 1;
        int width = 0;
        for (int i = start; i <= end; i++) {
            width += words[i].length();
        }
        int gap = end - start;
        int spaceBetween = lastLine ? 1 : (maxWidth - width) /gap;
        int remainder = lastLine ? 0 : (maxWidth - width) % gap;
        StringBuilder sb = new StringBuilder();
        for (int i = start; i < end; i++) {
            sb.append(words[i]);
            sb.append(whitespace(spaceBetween));
            sb.append(remainder-- > 0 ? " " : "");
        }
        sb.append(words[end]);
        if (lastLine) {
            return padRight(sb.toString(), maxWidth);
        } else {
            return sb.toString();
        }
    }
    
    private String padRight(String str, int maxWidth) {
        return str + whitespace(maxWidth - str.length());
    }
    
    private String whitespace(int cnt) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < cnt; i++) {
            sb.append(" ");
        }
        return sb.toString();
    }
}

Last updated

Was this helpful?