题目地址:
https://leetcode.com/problems/sentence-screen-fitting/description/
给定一个长 n n n的单词列表,再给定 r r r行 c c c列的屏幕,我们要将单词列表顺次填写到每一行中,所有单词填完之后再填一轮,如此下去。除了每行第一个单词之外,其余单词填的时候必须前面加一个空格,并且同行两个单词之间最多一个空格。问能填多少轮。
开一个哈希表,存这样的信息:当下标 i i i的单词为某一行的第一个单词的时候,这一行能填多少个单词。接下来枚举每一行,如果已经知道了当前行的第一个单词下标,则当前行有多少个单词已经知道了,直接累加单词数再枚举下一行;如果不知道,则暴力求出当前行填多少个单词,并且将信息存入哈希表。最后只需要返回总共的单词数除以 n n n即可。代码如下:
class Solution {
public:
int wordsTyping(vector<string>& a, int rs, int cs) {
unordered_map<int, int> mp;
int c = 0, n = a.size();
for (int i = 0; i < rs; i++) {
// 求一下当前行的第一个单词的下标
int st = c % n;
if (!mp.count(st)) {
// 暴力求一下以a[st]开头的行能存多少个单词
int cnt = 0, len = 0;
for (int j = st; len < cs; j = (j + 1) % n, cnt++) {
if (len + a[j].size() > cs) break;
len += a[j].size() + 1;
}
c += cnt;
mp[st] = cnt;
} else c += mp[st];
}
return c / n;
}
};
时间复杂度 O ( r n c ) O(rnc) O(rnc),空间 O ( n ) O(n) O(n)。