Welcome to Subscribe On Youtube
806. Number of Lines To Write String
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.
Solutions
-
class Solution { private static final int MAX_WIDTH = 100; public int[] numberOfLines(int[] widths, String s) { int last = 0, row = 1; for (char c : s.toCharArray()) { int w = widths[c - 'a']; if (last + w <= MAX_WIDTH) { last += w; } else { ++row; last = w; } } return new int[] {row, last}; } }
-
class Solution { public: const int MAX_WIDTH = 100; vector<int> numberOfLines(vector<int>& widths, string s) { int last = 0, row = 1; for (char c : s) { int w = widths[c - 'a']; if (last + w <= MAX_WIDTH) last += w; else { ++row; last = w; } } return {row, last}; } };
-
class Solution: def numberOfLines(self, widths: List[int], s: str) -> List[int]: last, row = 0, 1 for c in s: w = widths[ord(c) - ord('a')] if last + w <= 100: last += w else: row += 1 last = w return [row, last]
-
func numberOfLines(widths []int, s string) []int { last, row := 0, 1 for _, c := range s { w := widths[c-'a'] if last+w <= 100 { last += w } else { row++ last = w } } return []int{row, last} }
-
impl Solution { pub fn number_of_lines(widths: Vec<i32>, s: String) -> Vec<i32> { let mut count = 1; let mut sum = 0; for c in s.as_bytes() { let width = widths[(c - b'a') as usize]; if sum + width > 100 { sum = 0; count += 1; } sum += width; } vec![count, sum] } }
-
function numberOfLines(widths: number[], s: string): number[] { let [lines, last] = [1, 0]; for (const c of s) { const w = widths[c.charCodeAt(0) - 'a'.charCodeAt(0)]; if (last + w <= 100) { last += w; } else { ++lines; last = w; } } return [lines, last]; }