Description

You are given a string s of lowercase English letters and an array widths denoting how many pixels wide each lowercase English letter is. Specifically, widths[0] is the width of 'a', widths[1] is the width of 'b', and so on.

You are trying to write s across several lines, where each line is no longer than 100 pixels. Starting at the beginning of s, write as many letters on the first line such that the total width does not exceed 100 pixels. Then, from where you stopped in s, continue writing as many letters as you can on the second line. Continue this process until you have written all of s.

Return an array result of length 2 where:

  • result[0] is the total number of lines.
  • result[1] is the width of the last line in pixels.

Example 1:

  • Input:
    widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10],
    s = “abcdefghijklmnopqrstuvwxyz”
  • Output: [3,60]
  • Explanation: You can write s as follows:
    abcdefghij // 100 pixels wide
    klmnopqrst // 100 pixels wide
    uvwxyz // 60 pixels wide
    There are a total of 3 lines, and the last line is 60 pixels wide.

Example 2:

  • Input:
    widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10],
    s = “bbbcccdddaaa”
  • Output: [2,4]
  • Explanation: You can write s as follows:
    bbbcccdddaa // 98 pixels wide
    a // 4 pixels wide
    There are a total of 2 lines, and the last line is 4 pixels wide.

Constraints:

  • widths.length == 26
  • 2 <= widths[i] <= 10
  • 1 <= s.length <= 1000
  • s contains only lowercase English letters.

Submitted Code

class Solution(object):
    def numberOfLines(self, widths, s):
        """
        :type widths: List[int]
        :type s: str
        :rtype: List[int]
        """
        lines = 1           # total lines
        current = 0         # wide of current line

        for ch in s:
            pixel = widths[ord(ch) - 97]    # ord('a') = 97

            if current + pixel > 100:
                lines += 1
                current = pixel
            else:
                current += pixel

        return [lines, current]

Runtime: 8 ms | Beats 97.27%
Memory: 12.45 MB | Beats 56.82%

각 문자의 아스키코드 값을 이용하여 widths의 인덱스 값을 계산했다. 만약 현재 라인의 픽셀 수가 정확히 100일 때 s가 끝날 경우 다음 라인으로 넘어가지 않고 그대로 멈춘다는 것을 유의해야 했다.

Other Solutions

1st

    def numberOfcurs(self, widths, S):
        res, cur = 1, 0
        for i in S:
            width = widths[ord(i) - ord('a')]
            res += 1 if cur + width > 100 else 0              # 라인
            cur = width if cur + width > 100 else cur + width # 현재 너비
        return [res, cur]

time complexity: 𝑂(𝑛)
space complexity: 𝑂(1)

좀 더 보기 좋게 정돈된 코드가 있어서 참고했다.

Leave a comment