返回介绍

solution / 0400-0499 / 0418.Sentence Screen Fitting / README

发布于 2024-06-17 01:04:00 字数 4299 浏览 0 评论 0 收藏 0

418. 屏幕可显示句子的数量

English Version

题目描述

给你一个 rows x cols 的屏幕和一个用 非空 的单词列表组成的句子,请你计算出给定句子可以在屏幕上完整显示的次数。

注意:

  1. 一个单词不能拆分成两行。
  2. 单词在句子中的顺序必须保持不变。
  3. 在一行中 的两个连续单词必须用一个空格符分隔。
  4. 句子中的单词总量不会超过 100。
  5. 每个单词的长度大于 0 且不会超过 10。
  6. 1 ≤ rows, cols ≤ 20,000.

 

示例 1:

输入:
rows = 2, cols = 8, 句子 sentence = ["hello", "world"]

输出:
1

解释:
hello---
world---

字符 '-' 表示屏幕上的一个空白位置。

 

示例 2:

输入:
rows = 3, cols = 6, 句子 sentence = ["a", "bcd", "e"]

输出:
2

解释:
a-bcd- 
e-a---
bcd-e-

字符 '-' 表示屏幕上的一个空白位置。

 

示例 3:

输入:
rows = 4, cols = 5, 句子 sentence = ["I", "had", "apple", "pie"]

输出:
1

解释:
I-had
apple
pie-I
had--

字符 '-' 表示屏幕上的一个空白位置。

 

解法

方法一:贪心

我们将句子的每个单词拼接上一个空格,然后把句子拼接起来,得到字符串 $s$。例如,对于句子 ["hello", "world"],得到的字符串为 "hello world "。记 $s$ 的长度为 $m$。

接下来,我们使用贪心的方法,找到最大的可显示句子数。定义一个变量 $cur$,表示当前已经在屏幕上显示的字符串的长度,初始时 $cur=0$。

我们循环 $rows$ 次,每次循环中,我们首先将 $cur$ 增加 $cols$,如果 $s[cur \bmod m]$ 是一个空格,说明我们可以将完整的若干个单词放置到当前行,因此我们将 $cur$ 增加一个额外的 $1$;否则,说明我们需要回退 $cur$,直到 $cur$ 指向的字符是一个空格为止。然后继续下一次循环。

循环结束,返回 $\lfloor \frac{cur}{m} \rfloor$ 即可。

时间复杂度 $O(rows \times M)$,空间复杂度 $O(L)$。其中 $M$ 是单词的最大长度,而 $L$ 是单词的总长度。

class Solution:
  def wordsTyping(self, sentence: List[str], rows: int, cols: int) -> int:
    s = " ".join(sentence) + " "
    m = len(s)
    cur = 0
    for _ in range(rows):
      cur += cols
      if s[cur % m] == " ":
        cur += 1
      while cur and s[(cur - 1) % m] != " ":
        cur -= 1
    return cur // m
class Solution {
  public int wordsTyping(String[] sentence, int rows, int cols) {
    String s = String.join(" ", sentence) + " ";
    int m = s.length();
    int cur = 0;
    while (rows-- > 0) {
      cur += cols;
      if (s.charAt(cur % m) == ' ') {
        ++cur;
      } else {
        while (cur > 0 && s.charAt((cur - 1) % m) != ' ') {
          --cur;
        }
      }
    }
    return cur / m;
  }
}
class Solution {
public:
  int wordsTyping(vector<string>& sentence, int rows, int cols) {
    string s;
    for (auto& t : sentence) {
      s += t;
      s += " ";
    }
    int m = s.size();
    int cur = 0;
    while (rows--) {
      cur += cols;
      if (s[cur % m] == ' ') {
        ++cur;
      } else {
        while (cur && s[(cur - 1) % m] != ' ') {
          --cur;
        }
      }
    }
    return cur / m;
  }
};
func wordsTyping(sentence []string, rows int, cols int) int {
  s := strings.Join(sentence, " ") + " "
  m := len(s)
  cur := 0
  for i := 0; i < rows; i++ {
    cur += cols
    if s[cur%m] == ' ' {
      cur++
    } else {
      for cur > 0 && s[(cur-1)%m] != ' ' {
        cur--
      }
    }
  }
  return cur / m
}
function wordsTyping(sentence: string[], rows: number, cols: number): number {
  const s = sentence.join(' ') + ' ';
  let cur = 0;
  const m = s.length;
  for (let i = 0; i < rows; ++i) {
    cur += cols;
    if (s[cur % m] === ' ') {
      ++cur;
    } else {
      while (cur > 0 && s[(cur - 1) % m] !== ' ') {
        --cur;
      }
    }
  }
  return Math.floor(cur / m);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文