2018-12-19

LeetCode 68. Text Justification.jpg

LeetCode 68. Text Justification

Description

Given an array of words and a width maxWidth, format the text such that each line has exactly maxWidth characters and is fully (left and right) justified.

You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactly maxWidth characters.

Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.

For the last line of text, it should be left justified and no extra space is inserted between words.

Note:

A word is defined as a character sequence consisting of non-space characters only.
Each word's length is guaranteed to be greater than 0 and not exceed maxWidth.
The input array words contains at least one word.
Example 1:

Input:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
Output:
[
"This is an",
"example of text",
"justification. "
]
Example 2:

Input:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
Output:
[
"What must be",
"acknowledgment ",
"shall be "
]
Explanation: Note that the last line is "shall be " instead of "shall be",
because the last line must be left-justified instead of fully-justified.
Note that the second line is also left-justified becase it contains only one word.
Example 3:

Input:
words = ["Science","is","what","we","understand","well","enough","to","explain",
"to","a","computer.","Art","is","everything","else","we","do"]
maxWidth = 20
Output:
[
"Science is what we",
"understand well",
"enough to explain to",
"a computer. Art is",
"everything else we",
"do "
]

描述

給定一個(gè)單詞數(shù)組和一個(gè)寬度maxWidth蔓倍,格式化文本臂拓,使每行具有正確的maxWidth字符并完全(左和右)對(duì)齊荤牍。

你應(yīng)該使用貪婪的方式處理每一行; 也就是說(shuō)破喻,在每行中包含盡可能多的單詞。 必要時(shí)填充額外的空格,以便每行具有正確的maxWidth字符。

單詞之間的額外空格應(yīng)盡可能均勻分布赊抖。 如果一行上的空格數(shù)不均勻分配,則左側(cè)的空插槽將分配比右側(cè)插槽更多的空格寨典。

對(duì)于最后一行文本熏迹,它應(yīng)該是左對(duì)齊的,并且在單詞之間不插入額外的空格凝赛。

注意:

單詞定義為僅由非空格字符組成的字符序列注暗。
每個(gè)單詞的長(zhǎng)度保證大于0且不超過(guò)maxWidth。
輸入數(shù)組字包含至少一個(gè)字墓猎。

思路

  • 這道題并沒(méi)有考察特別的算法捆昏,按照題目要求處理即可.
  • 題意是給定一些單詞,給定一行的最大寬度maxWidth(即最多能夠放多少個(gè)字符)毙沾,讓把這些單詞按行放置骗卜,
  • 要求:盡可能多的放置單詞在每一行中,每個(gè)單詞之間空格隔開(kāi)左胞,空格均勻分布寇仓,且左邊的空格數(shù)大于右邊的空格數(shù)
  • 例如一行有四個(gè)單詞,四個(gè)單詞占據(jù)了9個(gè)字符烤宙,一行允許有16個(gè)字符:則四個(gè)單詞需要三個(gè)間隔遍烦,三個(gè)間隔共占據(jù)7個(gè)空格
  • 每個(gè)間隔的空格數(shù)為:3,2躺枕,2
  • 我們使用nums表示單詞個(gè)數(shù)服猪,count來(lái)表示已經(jīng)占據(jù)的字符個(gè)數(shù),words數(shù)組中從下標(biāo)i到j(luò)的單詞一共需要占據(jù)如下公式個(gè)字符:

count[i:j] = \sum_{k=i}^j{(len(words[k])+1)}

  • 因?yàn)槊總€(gè)單詞至少都要一個(gè)空格(最后一個(gè)單詞是不需要的空格的,單獨(dú)處理)
  • 當(dāng)count大于等于最大寬度的時(shí)候拐云,我們開(kāi)始填入一行
  • 如果count>maxWidth+2:表示count中的最后一個(gè)單詞需要填在下一行罢猪,我們讓nums減去1,count減去最后一個(gè)單詞與一個(gè)空格的長(zhǎng)度.
  • evenspace表示每個(gè)單詞(除去最后一個(gè)單詞)都能分配到的字符叉瘩,lastspace表示剩余的字符
  • 我們?yōu)閱卧~分配一個(gè)evenspace個(gè)數(shù)的空格字符串膳帕,然后檢查lastspace是否大于0,若是則再給單詞分配一個(gè)空格.
  • 我們最后再把最后一個(gè)單詞填入當(dāng)前行
from pprint import pprint


class Solution:
    def fullJustify(self, words, maxWidth):
        """
        :type words: List[str]
        :type maxWidth: int
        :rtype: List[str]
        """
        wordsnum, nums, count, res, sequence = len(words), 0, 0, [], []
        if not wordsnum:
            return None
        i = 0
        while i < wordsnum:
            # 記錄當(dāng)前的所有索引
            sequence.append(i)
            # 記錄當(dāng)前已經(jīng)占據(jù)的字符個(gè)數(shù)
            count += len(words[i])+1
            # 記錄當(dāng)前的單詞個(gè)數(shù)
            nums += 1
            # 如果當(dāng)前占據(jù)的字符個(gè)數(shù)已經(jīng)超過(guò)了最大寬度
            if count >= maxWidth:
                # 如果是嚴(yán)格超出了一個(gè)單詞
                if count >= maxWidth+2:
                    # 當(dāng)前已經(jīng)占據(jù)的寬度減去最后一次添加的單詞長(zhǎng)度薇缅,減去一個(gè)空格
                    count = count - 1 - len(words[i])
                    # 單詞個(gè)數(shù)減一
                    nums = nums - 1
                    # 單詞索引回退一個(gè)
                    i = i-1
                    # 數(shù)組彈出最后一個(gè)單詞的索引
                    sequence.pop()
                # 空格字符的個(gè)數(shù) = 最大寬度 - 所有單詞所占據(jù)的個(gè)數(shù)
                space = maxWidth - (count - nums)
                # 如果當(dāng)前行不止一個(gè)單詞
                if nums > 1:
                    # 每個(gè)單詞(除去最后一個(gè)單詞危彩,因?yàn)樗恍枰紦?jù)空格)能夠被平均分配的空格
                    evensapce = space//(nums-1)
                    # 剩余的空格數(shù),這些空格將從前往后捅暴,依次分配給每個(gè)單詞恬砂,每個(gè)單詞分配一個(gè)空格咧纠,直到所有的空格都分配完為止
                    lastspace = space % (nums-1)
                else:
                    # 如果只有一個(gè)單詞蓬痒,則所有的空格都將被分配給它
                    lastspace = space
                line = ''
                # 從前往后為每一個(gè)單詞分配空格(最后一個(gè)不分配)
                for index in sequence[:-1]:
                    line += words[index]+' '*evensapce
                    if lastspace > 0:
                        line += ' '
                        lastspace -= 1
                # 填入最后一個(gè)單詞:在單詞個(gè)數(shù)不止一個(gè)的情況下lastspace==0,在只有一個(gè)單詞的情況下lastspace可能不為0
                # 如果單詞長(zhǎng)度 == maxWidth漆羔,即使只有一個(gè)單詞梧奢,lastspace也為零狱掂,所以說(shuō)"在只有一個(gè)單詞的情況下lastspace可能不為0"
                line += words[sequence[-1]]+" "*lastspace
                # 在結(jié)果數(shù)組中添加當(dāng)前結(jié)果
                res.append(line)
                # 重置 nums, count, sequence
                nums, count, sequence = 0, 0, []
                del line
            i += 1
        if sequence:
            line = ''
            for index in sequence:
                line += words[index]+' '
            line += ' '*(maxWidth - count)
            res.append(line)
            del line

        return res


if __name__ == "__main__":
    so = Solution()
    res = so.fullJustify(
        ["What", "must", "be", "acknowledgment", "shall", "be"], 16)
    pprint(res)

源代碼文件在這里.
?本文首發(fā)于何睿的博客,歡迎轉(zhuǎn)載亲轨,轉(zhuǎn)載需保留文章來(lái)源趋惨,作者信息和本聲明.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惦蚊,隨后出現(xiàn)的幾起案子器虾,更是在濱河造成了極大的恐慌,老刑警劉巖蹦锋,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兆沙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡莉掂,警方通過(guò)查閱死者的電腦和手機(jī)葛圃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)憎妙,“玉大人库正,你說(shuō)我怎么就攤上這事±逋伲” “怎么了褥符?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抚垃。 經(jīng)常有香客問(wèn)我属瓣,道長(zhǎng),這世上最難降的妖魔是什么讯柔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任抡蛙,我火速辦了婚禮,結(jié)果婚禮上魂迄,老公的妹妹穿的比我還像新娘粗截。我一直安慰自己,他們只是感情好捣炬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布熊昌。 她就那樣靜靜地躺著,像睡著了一般湿酸。 火紅的嫁衣襯著肌膚如雪婿屹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天推溃,我揣著相機(jī)與錄音昂利,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜂奸,可吹牛的內(nèi)容都是我干的犁苏。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扩所,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼围详!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起祖屏,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤助赞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袁勺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嫉拐,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年魁兼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婉徘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咐汞,死狀恐怖盖呼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情化撕,我是刑警寧澤几晤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站植阴,受9級(jí)特大地震影響蟹瘾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掠手,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一憾朴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喷鸽,春花似錦众雷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至混槐,卻和暖如春编兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背声登。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工狠鸳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揣苏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓碰煌,卻偏偏與公主長(zhǎng)得像舒岸,于是被迫代替她去往敵國(guó)和親绅作。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芦圾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,312評(píng)論 0 10
  • 想不到水泥公司這么賺錢(qián),是什么原因呢?比如海螺水泥俄认,收入是700多個(gè)億个少,但是凈利潤(rùn)是200億,達(dá)到了20%以上的...
    愛(ài)成功閱讀 800評(píng)論 0 1
  • 只要微笑眯杏,就一定能得到好運(yùn)夜焦。年輕資本,為什么不拼一拼呢岂贩?茫经!為什么不積極的,為什么不快樂(lè)呢萎津?
    大家來(lái)看我的笑聲閱讀 176評(píng)論 0 1
  • 高銘玉閱讀 141評(píng)論 2 0
  • 作者|于海鳳 我現(xiàn)在只想躲在墻角做一朵云 當(dāng)風(fēng)吹向我 當(dāng)人群穿過(guò)我 當(dāng)花朵在我空曠的心底長(zhǎng)出 當(dāng)陽(yáng)光半明半暗 當(dāng)雨...
    小城孤棧閱讀 330評(píng)論 5 7