【Leetcode】418. Sentence Screen Fitting

题目地址:

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值