leetcode の質問ノート 68

単語の配列 words と length を指定してmaxWidth 、単語を maxWidth 1 行に 1 文字ずつ、左右に揃えてテキストに再フォーマットします。

指定された単語を配置するには、「貪欲アルゴリズム」を使用する必要があります。つまり、各行にできるだけ多くの単語を配置する必要があります。' ' 各行に正確に maxWidth文字が含まれるように、必要に応じてスペース を埋め込みます 。

要件は、単語間のスペースの量をできるだけ均等に配分することです。行上の単語間のスペースが均等に分散されていない場合は、右側よりも左側に多くのスペースを配置します。

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

知らせ:

  • 単語は、スペース以外の文字で構成される一連の文字です。
  • 各単語の長さは 0 より大きく、 maxWidth以下です 
  • 入力単語配列には words 少なくとも 1 つの単語が含まれます。

アイデア 1: 貪欲

char ** fullJustify(char ** words, int wordsSize, int maxWidth, int* returnSize){
    char **ret = malloc(sizeof(char*) * wordsSize);
    int i, j, sumnum, wordnum, count, index, average, remind;
    char *space = malloc(sizeof(char) * maxWidth);
    *returnSize = 0;
    for(i = 0; i < maxWidth; i++){
        space[i] = ' ';
    }
    for (i = 0; i < wordsSize; ) {
        count = 1;
        index = 0;
        sumnum = wordnum = strlen(words[i++]);
        while (i < wordsSize && sumnum <= maxWidth) {
            wordnum += strlen(words[i]);
            sumnum += strlen(words[i++]) + 1;
            count++;
        }
        if(sumnum > maxWidth){
            i--;
            count--;
            sumnum -= (strlen(words[i]) + 1);
            wordnum -= strlen(words[i]);
            if(count == 1){
                average = (maxWidth - wordnum) / (count);
                remind = (maxWidth - wordnum) - (count) * average;
            } else {
                average = (maxWidth - wordnum) / (count - 1);
                remind = (maxWidth - wordnum) - (count - 1) * average;
            }
            ret[*returnSize] = calloc(sizeof(char), (maxWidth + 1));
            for(j = 0; j < count; j++){
                memcpy(ret[*returnSize] + index, words[i - count + j], 
                       strlen(words[i - count + j]));
                index += strlen(words[i - count + j]);
                if(index == maxWidth){
                    break;   
                }
                if(remind > 0){
                    memcpy(ret[*returnSize] + index, space, sizeof(char) * (average + 1));
                    remind--;
                    index += average + 1;
                } else {
                    memcpy(ret[*returnSize] + index, space, sizeof(char) * average);
                    index += average;
                }
            }
            (*returnSize)++;
        } else {
            ret[*returnSize] = calloc(sizeof(char), (maxWidth + 1));
            for(j = 0; j < count; j++){
                memcpy(ret[*returnSize] + index, words[wordsSize - count + j],
                       strlen(words[wordsSize - count + j]));
                index += strlen(words[wordsSize - count + j]);
                if(index < maxWidth)
                    ret[*returnSize][index++] = ' ';
            }
            for(; index < maxWidth; ){
                ret[*returnSize][index++] = ' ';
            }
            (*returnSize)++;
        }
    }
    return ret;
}

分析します:

この質問では、maxwidth に従って各行に何語を配置するかを決定する必要があり、それぞれの状況を個別に議論する必要があります。単語内の文字数が maxwidth を超える場合は、新しい行を開始して単語間のスペースを埋めます。最後に答えを出力します。

要約:

この問題には考えなければならない状況がたくさんありますが、問題の意味を真似してそれぞれの状況を考えれば完全に解けます。

おすすめ

転載: blog.csdn.net/si_mple_/article/details/132239462