文本左右对齐

分析

这道题相对同组其他题来说比较繁琐, 究其原因是因为这更像道业务逻辑题而不是算法题。 我们只需要抓住三种情况:

解答

class Solution {
private:
  auto blank(int n) { return string(n, ' '); }
  auto join(const vector<string> &words, int left, int right,
            const string &sep) {
    auto s = words[left];
    for (auto i = left + 1; i < right; ++i)
      s += sep + words[i];

    return s;
  }

public:
  vector<string> fullJustify(vector<string> &words, int maxWidth) {
    vector<string> ans;
    auto right = 0;
    int n = words.size();
    while (true) {
      auto left = right;
      auto sum_len = 0;

      while (right < n &&
             sum_len + words[right].length() + right - left <= maxWidth)
        sum_len += words[right++].length();

      if (right == n) {
        auto s = join(words, left, n, " ");
        ans.emplace_back(s + blank(maxWidth - s.length()));
        return ans;
      }

      auto num_words = right - left;
      auto num_spaces = maxWidth - sum_len;

      if (num_words == 1) {
        ans.emplace_back(words[left] + blank(num_spaces));
        continue;
      }

      auto avg_spaces = num_spaces / (num_words - 1);
      auto extra_spaces = num_spaces % (num_words - 1);
      auto s1 =
          join(words, left, left + extra_spaces + 1, blank(avg_spaces + 1));
      auto s2 = join(words, left + extra_spaces + 1, right, blank(avg_spaces));
      ans.emplace_back(s1 + blank(avg_spaces) + s2);
    }
  }
};
返回文章列表