> For the complete documentation index, see [llms.txt](https://quenluo.gitbook.io/leecode-python/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://quenluo.gitbook.io/leecode-python/806.-number-of-lines-to-write-string.md).

# 806. Number of Lines To Write String

## Question 806 <a href="#question-66" id="question-66"></a>

<https://leetcode.com/problems/number-of-lines-to-write-string/description/>

We are to write the letters of a given string `S`, from left to right into lines. Each line has maximum width 100 units, and if writing a letter would cause the width of the line to exceed 100 units, it is written on the next line. We are given an array `widths`, an array where widths\[0] is the width of 'a', widths\[1] is the width of 'b', ..., and widths\[25] is the width of 'z'.

Now answer two questions: how many lines have at least one character from `S`, and what is the width used by the last such line? Return your answer as an integer list of length 2.

```
Example :
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: 
All letters have the same length of 10. To write all 26 letters,
we need two full lines and one line with 60 units.
```

```
Example :
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: 
All letters except 'a' have the same length of 10, and 
"bbbcccdddaa" will cover 9 * 10 + 2 * 4 = 98 units.
For the last 'a', it is written on the second line because
there is only 2 units left in the first line.
So the answer is 2 lines, plus 4 units in the second line.
```

### Answer&#x20;

### v1. use ord() + two conditional (26.02%) <a href="#v-1-switch-to-int-first" id="v-1-switch-to-int-first"></a>

1. 用字母的 ascii code 相減來帶出 widths
2. 如果剛好是 100 就換行
3. 如果會超過 100 也換行，並將該字母移至下行

### v2. use ord() + one conditional (100%) <a href="#v-1-switch-to-int-first" id="v-1-switch-to-int-first"></a>

1. 將 'a' 的 ascii code 提出來當變數
2. 在 for 裡面只跑一個 if 當超過 100 就換行，剛好是 100 時就會在下一次相加時進 if
3. 最後再檢查一次，最後一行是不是滿了

{% tabs %}
{% tab title="v1" %}

```python
class Solution(object):
    def numberOfLines(self, widths, S):

        total,raw = 0, 1
        for s in S:
            total += widths[ord(s)-ord('a')]
            if(total == 100):
                total = 0
                raw += 1
            elif(total > 100):
                total = widths[ord(s)-ord('a')]
                raw +=1
        return [raw, total]
        
```

{% endtab %}

{% tab title="v2" %}

```python
class Solution(object):
    def numberOfLines(self, widths, S):

        total,raw = 0, 1
        Ord_a = ord('a')
        for s in S:
            total += widths[ord(s)-Ord_a]
            if(total > 100):
                total = widths[ord(s)-Ord_a]
                raw +=1
        if total == 100:
            raw += 1
            total = 0
        return [raw, total]
```

{% endtab %}
{% endtabs %}
