天天看点

[LeetCode] Sentence Screen Fitting 调整屏幕上的句子

Given a <code>rows x cols</code> screen and a sentence represented by a list of words, find how many times the given sentence can be fitted on the screen.

Note:

A word cannot be split into two lines.

The order of words in the sentence must remain unchanged.

Two consecutive words in a line must be separated by a single space.

Total words in the sentence won't exceed 100.

Length of each word won't exceed 10.

1 ≤ rows, cols ≤ 20,000.

Example 1:

Example 2:

Example 3:

这道题给我们了一个句子,由若干个单词组成,然后给我们了一个空白屏幕区域,让我们填充单词,前提是单词和单词之间需要一个空格隔开,而且单词不能断开,如果当前行剩余位置放下不下某个单词,则必须将该单词整个移动到下一行。我刚开始想的是便利句子,每个单词分别处理,但是这种做法很不高效,因为有可能屏幕的宽度特别大,而单词可能就一两个,那么我们这样遍历的话就太浪费时间了,应该直接用宽度除以句子加上空格的长度之和,可以快速的得到能装下的个数。下面这种方法设计的很巧妙,思路是用start变量来记录下能装下的句子的总长度,最后除以一个句子的长度,就可以得到个数。而句子的总长度的求法时要在每个单词后面加上一个空格(包括最后一个单词),我们遍历屏幕的每一行,然后每次start都加上宽度,然后看all[start%len]是否为空格,是的话就start加1,这样做的好处是可以处理末尾是没有空格的情况,比如宽度为1,只有一个单词a,那么我们都知道是这样放的 a ,start变为1,len是2,all[start%len]是空格,所以start自增1,变成2,这样我们用start/len就知道能放下几个了。对于all[start%len]不为空格的情况,如果all[(start-1)%len]也不为空格,那么start就自减1,进行while循环,直至其为空格为止。大家可以自己带例子尝试,个人觉得想出此方法的人真是太聪明了:

解法一:

下面这种方法也是很棒,同样也需要统计加空格的句子总长度,然后遍历每一行,初始化colsRemaining为cols,然后还需要一个变量idx,来记录当前单词的位置,如果colsRemaining大于0,就进行while循环,如果当前单词的长度小于等于colsRemaining,说明可以放下该单词,那么就减去该单词的长度就是剩余的空间,然后如果此时colsRemaining仍然大于0,则减去空格的长度1,然后idx自增1,如果idx此时超过单词个数的范围了,说明一整句可以放下,那么就有可能出现宽度远大于句子长度的情况,所以我们加上之前放好的一句之外,还要加上colsRemaining/len的个数,然后colsRemaining%len是剩余的位置,此时idx重置为0,参见代码如下:

解法二: