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.
【题意】
给的widths数组里面的值对应的就是a-z字符长度。现在给一个string S,是由a-z组成,那么打印S需要多少行,最后一行多少长度?其中每行最多长度为100.
【思路】
直接遍历S即可。
时间复杂度O(n),空间O(1).
【代码】
class Solution {
public:
vector<int> numberOfLines(vector<int>& widths, string S) {
int lines = 1;
int curNum = 0;
int maxNum = 100;
for(int i=0; i<S.size(); i++){
char ch = S[i];
int index = S[i] - 'a';
curNum += widths[index];
if(curNum > maxNum){
curNum = widths[index];
lines ++;
}
}
vector<int> res;
res.push_back(lines);
res.push_back(curNum);
return res;
}
};