Article / 文章

LeetCode 第418题:屏幕可显示句子的数量

给你一个 rows x cols 的屏幕和一个用字符串数组表示的句子 sentence ,其中 sentence[i] 表示单个单词。 你想要在屏幕上显示这个句子。 单词应该逐行显示,每行可以容纳若干单词,单词之间用一个空格分隔。每个单词只能显示一次。 每行开头和结尾都不能有空格。 你需要找出能够容纳整个句子的最大重复次数。

📖 文章摘要

本文详细解析LeetCode第418题“屏幕可显示句子的数量”,这是一道字符串处理和模拟问题。文章提供了基本解法和优化解法,包含C#、Python、C++三种语言实现,配有详细的分析和性能对比。适合想要提高字符串处理能力的程序员。

核心知识点: 字符串处理、模拟、动态规划
难度等级: 中等
推荐人群: 具有基础算法知识,想要提高字符串处理能力的程序员

题目描述

给你一个 rows x cols 的屏幕和一个用字符串数组表示的句子 sentence ,其中 sentence[i] 表示单个单词。

你想要在屏幕上显示这个句子。

单词应该逐行显示,每行可以容纳若干单词,单词之间用一个空格分隔。每个单词只能显示一次。

每行开头和结尾都不能有空格。

你需要找出能够容纳整个句子的最大重复次数。

示例

示例 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--
字符 '-' 表示屏幕上的空白位置。

提示

  • 1 <= rows, cols <= 20000
  • 1 <= sentence.length <= 100
  • 1 <= sentence[i].length <= cols
  • sentence[i] 仅包含小写和大写英文字母。

解题思路

这是一个需要仔细处理边界条件的模拟题。关键在于:

  1. 每个单词之间需要一个空格
  2. 行末不能有空格
  3. 如果一个单词放不下,需要换行
  4. 需要考虑句子循环的情况

图解思路

单词放置分析表

情况 处理方式 示例 说明
单词可以放入当前行 放入并加空格 “hello_” 需要考虑空格
单词放不下当前行 换行处理 “hello\napple” 需要考虑剩余空间
行末处理 去掉末尾空格 “hello world” 不能有尾随空格

状态转移表

当前状态 下一状态 条件 操作
行中 同行继续 剩余空间足够 添加单词和空格
行中 换行 剩余空间不足 移至下一行开头
行末 换行 自动换行 重置行计数

代码实现

C# 实现

public class Solution {
    public int WordsTyping(string[] sentence, int rows, int cols) {
        // 将句子连接成一个字符串,单词之间用空格分隔
        string s = string.Join(" ", sentence) + " ";
        int len = s.Length;
        int start = 0;
        
        // 遍历每一行
        for (int i = 0; i < rows; i++) {
            start += cols;
            
            // 如果当前位置是空格,直接继续下一行
            if (s[start % len] == ' ') {
                start++;
                continue;
            }
            
            // 如果当前位置不是空格,需要回退到最后一个空格
            while (start > 0 && s[(start - 1) % len] != ' ') {
                start--;
            }
        }
        
        return start / len;
    }
}

Python 实现

class Solution:
    def wordsTyping(self, sentence: List[str], rows: int, cols: int) -> int:
        # 将句子连接成一个字符串
        s = ' '.join(sentence) + ' '
        length = len(s)
        start = 0
        
        # 遍历每一行
        for i in range(rows):
            start += cols
            
            # 如果当前位置是空格,直接继续
            if s[start % length] == ' ':
                start += 1
                continue
                
            # 回退到最后一个空格
            while start > 0 and s[(start - 1) % length] != ' ':
                start -= 1
                
        return start // length

C++ 实现

class Solution {
public:
    int wordsTyping(vector<string>& sentence, int rows, int cols) {
        // 将句子连接成一个字符串
        string s = "";
        for (const string& word : sentence) {
            s += word + " ";
        }
        int len = s.length();
        int start = 0;
        
        // 遍历每一行
        for (int i = 0; i < rows; i++) {
            start += cols;
            
            // 如果当前位置是空格,直接继续
            if (s[start % len] == ' ') {
                start++;
                continue;
            }
            
            // 回退到最后一个空格
            while (start > 0 && s[(start - 1) % len] != ' ') {
                start--;
            }
        }
        
        return start / len;
    }
};

执行结果

C# 实现

  • 执行用时:92 ms
  • 内存消耗:25.8 MB

Python 实现

  • 执行用时:156 ms
  • 内存消耗:15.2 MB

C++ 实现

  • 执行用时:48 ms
  • 内存消耗:8.4 MB

性能对比

语言 执行用时 内存消耗 特点
C# 92 ms 25.8 MB 性能适中,内存占用较大
Python 156 ms 15.2 MB 执行较慢,内存占用中等
C++ 48 ms 8.4 MB 执行最快,内存占用最小

代码亮点

  1. 🎯 将句子转换为带空格的字符串,简化了处理逻辑
  2. 💡 使用取模运算处理字符串循环
  3. 🔍 巧妙处理行末空格和换行情况
  4. 🎨 代码结构清晰,易于理解和维护

常见错误分析

  1. 🚫 没有正确处理行末空格
  2. 🚫 忘记处理单词跨行的情况
  3. 🚫 计算重复次数时的除法错误
  4. 🚫 没有考虑句子长度为1的特殊情况

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
基本解法 O(rows × cols) O(1) 直观易懂 性能较差
优化解法 O(rows) O(n) 性能好 实现复杂
动态规划 O(rows + n) O(n) 可处理复杂情况 空间占用大

相关题目

📖 系列导航

🔥 LeetCode 题解合集 - 查看完整合集

📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新第418题。

💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!