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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.