単語の配列 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 を超える場合は、新しい行を開始して単語間のスペースを埋めます。最後に答えを出力します。
要約:
この問題には考えなければならない状況がたくさんありますが、問題の意味を真似してそれぞれの状況を考えれば完全に解けます。