LeetCode 68テキストの配置の周りのJava実装

68.左右のテキストの配置

各行が正確にmaxWidthに文字、および左右揃えテキストを持って作り、アレイとワード長のmaxWidth、再フォーマットの言葉を考えます。

各行内の単語を配置することが可能な限り、と言うことです。あなたは、与えられた単語を配置するために、「貪欲法」を使用する必要があります。利用可能なスペース、必要な場合は、「各行が正確のmaxWidth文字を有するように、充填されました。

これは、可能な限り、単語間のスペースの数の均一な分布を必要とします。単語間スペースが均等に一列に分配することができない場合、スペースの数は、スペースの数よりも左から右へ配置しました。

テキストの最後の行は左揃え、と単語の間に余分なスペースを挿入しないべきです。

説明:

単語は非空白文字の文字列を指します。
各語の長さが0よりも大きい、またはそれ未満のmaxWidthに等しいです。
少なくとも一つの単語を含む単語の単語列を入力します。
例:

输入:
言葉= [「この」、「テキスト」、「正当化」「の」、「」、「例」「である」]
のmaxWidth = 16
输出:
[
、「これは、」
テキスト」の例」、
"正当化"。
]
示例2:

入力:
言葉= [ "何"、 "MUST"、 "BE"、 "条の"、 "謝辞" "BE"]
のmaxWidth = 16
出力:
[
"何をしなければなりません"、
"確認"、
"しなければならないの"
]
説明:、代わりに「しなければならない」と「しなければならない」しなければならない形式の最後の行に注意してください
最後の行ではなく、その周りの、左寄せされなければならないので、正当化できませんでした。
二行目は、左詰めされ、この行が一つだけの単語が含まれているため。
例3:

输入:
言葉= [「科学」、「ある」、「何を」、「私たちは」、「だけでなく」、「理解」、「十分」、「に」、「説明」、
「へ」は、「」、「コンピュータ「、 『アート』、 『ある』、 『すべて』、 『他』、 『私たちは』、 『やる。』]
のmaxWidth = 20
输出:
[
『科学は、私たちが』何で
『』よくわから
説明するのに十分な」 「、と
コンピュータ」。アート「、ある
『他のすべては、私たち』
『やります』
]

class Solution {
      
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> ret = new ArrayList<>();
        
        int index = 0;
        while(index < words.length){
            int cur = index, len = 0;
            // len + words[cur].length() + cur - index 为单词之间取 一个空格的长度
            while(cur < words.length && len + words[cur].length() + cur - index <= maxWidth){
                // 计算纯单词长度
                len = len + words[cur++].length();
            }
            cur--;
            // System.out.println(cur + " " + len);
            StringBuilder sb = new StringBuilder();
            // 区分最后一行
            if(cur == words.length - 1){
                for(int i = index; i <= cur; i++){
                    sb.append(words[i]);
                    if(i < cur){
                        sb.append(' ');
                    }
                }
            }else{
                int base = cur > index ? (maxWidth - len) / (cur - index) : (maxWidth - len);
                String baseStr = genSpace(base);
                int left = cur > index ? (maxWidth - len) % (cur - index) : 0;
                String leftStr = genSpace(base + 1);
                for(int i = index; i <= cur; i++){
                    sb.append(words[i]);
                    if(i < cur){
                        sb.append(left > 0 ? leftStr : baseStr);
                        left--;
                    }
                }
            }
            if(sb.length() < maxWidth){
                sb.append(genSpace(maxWidth - sb.length()));
            }
            ret.add(sb.toString());
            index = cur + 1;
        }
        return ret;
    }
    
    private String genSpace(int n){
        char[] cs = new char[n];
        Arrays.fill(cs, ' ');
        return new String(cs);
    }
}
发布了1182 篇原创文章 · 获赞 1万+ · 访问量 53万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/104341710