↓快轉到主要內容
  1. LeetCode/

LeetCode 806: Number of Lines To Write String

·1 分鐘· ·
LeetCode Easy Array String
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-07

  • 提交紀錄:Wrong Answer → Runtime Error → Wrong Answer ×6 → Runtime Error → Wrong Answer ×2 → Accepted

解題思路
#

從第 1 行、寬度 0 開始逐字模擬:目前寬度加上這個字母的寬度超過 100 才換行(新的一行寬度就是這個字母的寬度),否則加上去。剛好等於 100 時還在這一行,不用換行。

我的嘗試
#

這題提交了 12 次,起點是「剛好 100 時換到下一行、寬度歸零」這個錯誤的想法,之後一直在補洞:

  • 第一版用字母的 index 當寬度,忘了查 widths;只有一個 "a" 時還被最後的「寬度是 0 就少算一行」減成 [-1, 0]。
  • 換行之後先把寬度設成這個字母的寬度,後面的 if 又加了一次:[2, 23],答案 [2, 15]。
  • 把 if 改成 elif 之後,剛好寫滿 100 時被當成換行再減回來,得到 [1, 0],答案 [1, 100]。
  • 最後的 AC 版是在結尾補上「寬度是 0 就少一行、寬度改成 100」。

正確解法
#

class Solution:
    def numberOfLines(self, widths: List[int], s: str) -> List[int]:
        lines, cur = 1, 0
        for c in s:
            w = widths[ord(c) - ord("a")]
            if cur + w > 100:
                lines += 1
                cur = w
            else:
                cur += w
        return [lines, cur]

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 剛好 100 不換行,最後一行的寬度可以是 100。
  • 換行後新的一行寬度是這個字母的寬度,不要再加一次。
  • 寬度要查 widths,不是字母的 index。

面試口說整理
#

我從第一行開始逐字模擬,加上這個字母會超過 100 才換行,新的一行寬度就是這個字母的寬度,否則累加,最後回傳行數和最後一行的寬度。時間 O(n)。

相關文章

LeetCode 748: Shortest Completing Word
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 748 解題筆記:車牌只看字母並轉小寫計數,找出每個字母次數都夠的最短單字,同長度取最前面的
LeetCode 599: Minimum Index Sum of Two Lists
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 599 解題筆記:把 list1 的字串對應到 index,掃 list2 時算兩邊 index 的和,留下和最小的全部字串
LeetCode 14: Longest Common Prefix
·1 分鐘
LeetCode Easy Array String Trie
LeetCode 14 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度
LeetCode 804: Unique Morse Code Words
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 804 解題筆記:把每個單字轉成摩斯碼字串,放進集合後算有幾種
LeetCode 500: Keyboard Row
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 500 解題筆記:鍵盤的三列各做成集合,單字轉小寫後的字元集合是某一列的子集就保留
LeetCode 796: Rotate String
·1 分鐘
LeetCode Easy String String-Matching
LeetCode 796 解題筆記:goal 是 s 的旋轉,等價於兩者長度相同而且 goal 出現在 s + s 裡