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.
Note:
- The length of
S
will be in the range [1, 1000]. S
will only contain lowercase letters.widths
is an array of length26
.widths[i]
will be in the range of[2, 10]
.
這道題給了我們一個字符串,讓我們把里面的字母寫下來,規定了每一行的長度為100,然后每個字母的長度可以在widths數組中查詢,說是如果某一個字母加上后超過了長度100的限制,那么就移動到下一行,問我們最終需要多少行,和最后一行的長度。這道題並沒有太大的難度和技巧,就是楞頭寫唄,遍歷所有的字母,然后查表得到其寬度,然后看加上這個新寬度是否超了100,超了的話,行數計數器自增1,並且當前長度為這個字母的長度,因為另起了一行。如果沒超100,那么行長度就直接加上這個字母的長度。遍歷完成后返回行數和當前行長度即可,參見代碼如下:
class Solution { public: vector<int> numberOfLines(vector<int>& widths, string S) { int cnt = 1, cur = 0; for (char c : S) { int t = widths[c - 'a']; if (cur + t > 100) ++cnt; cur = (cur + t > 100) ? t : cur + t; } return {cnt, cur}; } };
參考資料:
https://leetcode.com/problems/number-of-lines-to-write-string/solution/