C++ 中的文本对齐


假设我们有一个单词数组和一个宽度 maxWidth,我们需要格式化文本,使每一行正好包含 maxWidth 个字符并完全对齐。我们应该以贪婪的方式打包我们的单词;也就是说,在每一行中尽可能多地打包单词。在必要时,我们将填充额外的空格“ ”,以使每一行正好包含 maxWidth 个字符。

这里单词之间的额外空格应该尽可能均匀地分布。如果一行上的空格数量不能被单词数量整除,则左侧的空位将分配比右侧的空位更多的空格。对于最后一行文本,它应该左对齐,并且单词之间不插入额外的空格。

因此,如果输入类似于

为了解决这个问题,我们将遵循以下步骤 -

  • 创建一个名为 result 的数组

  • 对于 i 从 0 到 a 的大小,更新 i 为 j

    • 宽度 := 0

    • 对于 j 从 i 到 a 的大小,并且宽度 + a[j] 的大小 + j – i <= b,

      • 宽度 := 宽度 + a[j] 的大小

    • 空格 := 1,额外 := 0

    • 如果 j – 1 != 1 且 j != a 的大小,则

      • 空格 := (b - 宽度) / j – i – 1

      • 额外 := (b - 宽度) mod (j – i – 1)

    • 行 := a[i]

    • 对于 k 从 i + 1 到 j

      • 将空格数量的空格与行连接起来

      • 如果额外 > 0,则将空格与行连接起来

      • 将额外减少 1

      • 行 := 将 a[k] 与行连接起来

    • x := 行的大小

    • 行 := 将 (b - x) 个空格与行连接起来

    • 将行插入到 result 中

  • 返回 res

示例

让我们看看以下实现以获得更好的理解 -

 实时演示

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
void print_vector(vector<vector<auto>> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<string> fullJustify(vector<string> &a, int b) {
      vector <string> result;
      int i, j;
      for(i = 0; i < a.size(); i = j){
         int width = 0;
         for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){
            width += a[j].size();
         }
         int space = 1;
         int extra = 0;
         if(j - i != 1 && j != a.size()){
            space = (b - width) / (j - i - 1);
            extra = (b - width) % (j - i - 1);
         }
         string line(a[i]);
         for(int k = i + 1; k < j; k++){
            line += string(space, ' ');
            if(extra-- > 0){
               line += " ";
            }
            line += a[k];
         }
         int x = line.size();
         line += string(b - x, ' ');
         result.push_back(line);
      }
      return result;
   }
};
main(){
   vector<string> v = {"I", "love", "coding.", "here", "we", "will", "write", "some", "program"};
   Solution ob;
   print_vector(ob.fullJustify(v, 16));
}

输入

["I", "love", "coding.", "here", "we", "will", "write", "some", "program"]
16

输出

[I love coding.,
here we will,
write some,
program ,
]

更新于: 2020年5月26日

1K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告