【Leetcode】68. Text Justification

该博客主要介绍了如何解决LeetCode上的文本左对齐问题。作者提出了两种情况,一种是左对齐且单词间间隔为1个空格,另一种是存在多个空格的情况。通过计算每行能放置的单词数量和空格分配,实现了满足题目要求的文本排版。代码中展示了具体的实现逻辑,时空复杂度为O(n),其中n为文本长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:

https://leetcode.com/problems/text-justification/

给定一个字符串数组 A A A,再给定一个正整数 w w w,要求对这些字符串排版, w w w表示每行的最大宽度,题目保证 w w w大于等于最长字符串的长度。在排版的时候,单词之间以空格隔开,并且要求每行的单词数尽可能多,左对齐,并且单词之间的空格数尽可能平均;如果无法做到平均,则要求靠左的空格比靠右的空格数多 1 1 1;对于最后一行我们特殊处理,直接要求其左对齐,并且右边补齐空格到宽度 w w w。输出排版完成之后每行是什么。

思路如下,我们分为两种情况考虑,一种是左对齐,并且间隔 1 1 1个空格,另一种是存在间隔多个空格的情形。

先求一下当前行能放多少个字符串,如果当前行只能放一个字符串或者当前行放完了所有字符串,则需要采取左对齐的方式,并且间隔的空格数为 1 1 1,于是把这些字符串中间隔开空格append起来,就成为当前行的结果;

如果不是,则说明间隔空格数可能不是 1 1 1个,此时算一下当前行的总空格数,除以当前行的间隔数,那么除出来的结果其实就是靠左的空格间隔是多长,比如是 s s s,但是我们还需要求出长 s + 1 s+1 s+1的间隔有多少个,这可以通过让总空格数对间隔数取余得到。

代码如下:

class Solution {
 public:
  vector<string> fullJustify(vector<string>& words, int maxWidth) {
    vector<string> res;
    for (int i = 0; i < words.size(); i++) {
      int len = words[i].size(), j = i + 1;
      while (j < words.size() && len + 1 + words[j].size() <= maxWidth)
        len += 1 + words[j++].size();

      int cnt = j - i;
      string s = words[i];
      if (cnt == 1 || j == words.size()) {
        for (int k = i + 1; k < j; k++) s += " " + words[k];
        s.insert(s.end(), maxWidth - s.size(), ' ');
      } else {
        int len_sp = (maxWidth - len + cnt - 1) / (cnt - 1);
        for (int k = i + 1, l = 0; k < j; k++, l++) {
          s.insert(s.end(), len_sp, ' ');
          if (l < (maxWidth - len + cnt - 1) % (cnt - 1)) s += ' ';
          s += words[k];
        }
      }
      res.push_back(s);
      i = j - 1;
    }

    return res;
  }
};

时空复杂度 O ( n ) O(n) O(n) n n n为最终的文本长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值