806. Number of Lines To Write String
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.
题目解释:这道题意思是按照a对应widths里面index为0的长度,b对应widths里面index为1的长度的规则,将S中每一个字符的长度相加,超过100时连同当前字符整个宽度进到下一行,最后求行数和最后行的宽度
1 //Time: O(n), Space: O(1) 2 public int[] numberOfLines(int[] widths, String S) { 3 if (widths == null || S == null || widths.length == 0 || S.length() == 0) { 4 return null; 5 } 6 7 int count = 1;//注意行数要从1开始 8 int length = 0; 9 10 for (char c : S.toCharArray()) { 11 length += widths[c - 'a']; 12 13 if (length > 100) { 14 count++; 15 length = widths[c - 'a'];//当宽度大于100时要reset新一行的宽度 16 } 17 } 18 19 return new int[]{count, length}; 20 }