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

Chương trình căn chỉnh một tập hợp các từ bằng cách chuyển chúng thành các dòng có cùng độ dài trong C ++

Giả sử chúng ta có một danh sách các từ và độ rộng k, chúng ta phải sắp xếp văn bản sao cho mỗi dòng có đúng k số ký tự và văn bản được căn lề đầy đủ. Ở đây, chúng tôi sẽ gói các từ của chúng tôi càng nhiều từ càng tốt mà chúng tôi có thể chèn vào mỗi dòng. Và chúng tôi sẽ thêm khoảng trắng '' khi cần thiết để mỗi dòng có đúng k ký tự.

Ở đâ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 là ["The", "grumpy", "wizards", "make", "độc", "brew", "for", "the", "evil", "queen", "và" , "Jack"] và k =13

thì đầu ra sẽ là -

The grumpy
wizards make
toxic brew
for the evil
queen and
Jack

Để 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ả
  • cho tôi trong phạm vi từ 0 đến kích thước của a, cập nhật tôi bằng 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
      • extra:=(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ụ (C ++)

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 = {"The", "grumpy", "wizards", "make", "toxic", "brew", "for", "the", "evil", "queen", "and", "Jack"};
   Solution ob;
   print_vector(ob.fullJustify(v, 13));
}

Đầu vào

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

Đầu ra

[The grumpy,
wizards make,
toxic brew,
for the evil,
queen and,
Jack ,]