C ++中的文本对齐

假设我们有一个单词数组和一个宽度maxWidth,我们必须对文本进行格式化,以使每行具有完全maxWidth个字符并完全对齐。我们应该用一种贪婪的态度来包装自己的话;因此,请在每一行中尽可能多地打包单词。我们将在必要时填充多余的空格'',以便每行都具有完全maxWidth字符。

在此,单词之间的多余空间应尽可能均匀地分布。如果一行中的空格数量在单词之间分配不均,则左侧的空插槽将比右侧的插槽分配更多的空间。对于文本的最后一行,应保留其两端对齐,并且单词之间不应插入多余的空格。

所以如果输入像

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

  • 创建一个名为result的数组

  • 对于范围0到a的i,将j更新i

    • 用行连接空格的空间数

    • 如果多余> 0,则用行连接空间

    • 减少额外的1

    • line:=用line连接a [k]

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

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

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

    • 宽度:= 0

    • 对于范围为i的j到a的大小和宽度+ a [j] + j的大小– i <= b,

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

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

    • 行:= a [i]

    • 对于范围i + 1至j的k

    • x:=线的大小

    • line:=用行连接(b-x)个空格

    • 将行插入结果

    • 返回资源

    示例

    让我们看下面的实现以更好地理解-

    #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 ,
    ]