Computer >> Máy Tính >  >> Lập trình >> C ++

Biện minh văn bản trong C ++


Giả sử chúng ta có một mảng từ và độ rộng maxWidth, chúng ta phải định dạng văn bản sao cho mỗi dòng có chính xác số ký tự maxWidth và được căn hoàn toàn. Chúng ta nên gói lời nói của mình theo cách tiếp cận tham lam; vì vậy, hãy đóng gói càng nhiều từ càng tốt trong mỗi dòng. Chúng tôi sẽ thêm khoảng trắng '' khi cần thiết để mỗi dòng có chính xác các ký tự Chiều rộng tối đa.

Ở đây, các khoảng trống thừa giữa các từ nên được phân bố đồng đều nhất có thể. Nếu số lượng khoảng trắng trên một dòng không chia đều giữa các từ, các ô trống ở bên trái sẽ được gán nhiều khoảng trắng hơn các ô ở bên phải. Đối với dòng cuối cùng của văn bản, nó phải được căn đều và không có khoảng trống thừa nào được chèn giữa các từ.

Vì vậy, nếu đầu vào giống như

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • tạo một mảng được gọi là kết quả

  • đối với tôi trong phạm vi từ 0 đến kích thước của a, hãy cập nhật tôi theo j

    • chiều rộng:=0

    • cho j trong phạm vi i đến kích thước của a và chiều rộng + kích thước của a [j] + j - i <=b,

      • width:=chiều rộng + kích thước của [j]

    • khoảng trắng:=1, thêm:=0

    • nếu j - 1! =1 và j! =kích thước của a thì

      • khoảng trắng:=(b - width) / j - i - 1

      • thêm:=(b - width) mod (j - i - 1)

    • dòng:=a [i]

    • cho k trong phạm vi i + 1 đến j

      • nối số khoảng trắng của khoảng trắng với dòng

      • nếu thêm> 0, sau đó nối khoảng trắng với dòng

      • giảm thêm 1

      • line:=nối một [k] với dòng

    • x:=kích thước của dòng

    • line:=nối (b - x) số khoảng trắng với dòng

    • chèn dòng vào kết quả

  • trả lại res

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

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

Đầu ra

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