C ++中的文本对齐
在此,单词之间的多余空间应尽可能均匀地分布。如果一行中的空格数量在单词之间分配不均,则左侧的空插槽将比右侧的插槽分配更多的空间。对于文本的最后一行,应保留其两端对齐,并且单词之间不应插入多余的空格。
所以如果输入像
为了解决这个问题,我们将遵循以下步骤-
创建一个名为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 , ]