806. Number of Lines To Write String

806. Number of Lines To Write String


題目

Leetcode題目

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 length 26.
  • widths[i] will be in the range of [2, 10].

解決

通過遍歷字符串S來判斷,若字母對應的寬度能夠滿足剩下的位置,就直接放進該行中,若不行,則新開一行來放置這些字母。
【n爲字符串S的長度】

  • 時間複雜度:O(n)
  • 空間複雜度:O(1)
// Runtime: 3ms
class Solution {
public:
    vector<int> numberOfLines(vector<int>& widths, string S) {
        vector<int> result;
        int lines = 1;
        int units = 0;
        int len = S.length();
        for (int i = 0; i < len; i++) {
            if (units + widths[S[i] - 'a'] <= 100) {
                // if it can fit in the rest of the positions
                units += widths[S[i] - 'a'];
            } else {
                // if it can't fit in the rest of the positions
                // creat a new lines to put it in
                lines++;
                units = widths[S[i] - 'a'];
            }
        }
        result.push_back(lines);
        result.push_back(units);
        return result;
    }
};
發佈了106 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章