力扣:文本左右对齐

原题链接
要求:
①每行尽可能放多的单词。
②在单词之间填补空格,使得每行的长度是 maxWidth
③单词之间的空格需要尽量均匀,如果空格数不能被(单词数量-1)整除,可让左边比右边多1。
④对于最后一行,只需实现左对齐,并且不用在单词之间添加额外空格。
⑤对于除最后一行的其他行,如果只有一个单词,则左对齐与④一样。
⑥除此之外,则左右对齐。

对于空格的分配:
对于每一行,首先做到对空格平均分配。空格可以安插在两两单词间隙之间,设单词间隙的个数为 cnt,空格个数为 r,如果有多出来的空格该如何分配呢?根据题干:如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。 所以我们把平均分配后剩下的空格数(r % cnt)从左到右依次加一。
其他的步骤就是模拟就行了!

c++:

class Solution {
    
    
public:
    vector<string> fullJustify(vector<string>& words, int maxWidth) {
    
    
        vector<string> res;
        for(int i = 0;i < words.size();i++)
        {
    
    
            int j = i + 1;//取每个单词的后一个单词
            int len = words[i].size();
            while(j < words.size() && len + 1 + words[j].size() <= maxWidth)//判断后一个单词是否满足要求,已有的长度+空格数+j的长度是否在maxWidth之内
            {
    
    
                len += 1 + words[j++].size();//更新长度
            }
            //i是该行满足要求的第一个单词,j是最后一个
            string line;//存储每一行
            if(j == words.size() || j == i + 1)//最后一行,或者除最后一行只有一个单词
            {
    
    
                line += words[i];
                for(int k = i + 1;k < j;k++) line += " " + words[k];//将所有单词加完
                while(line.size() < maxWidth) line += " ";//补充剩下的空格
            }
            else
            {
    
    
                int cnt = j - i - 1,r = maxWidth - len + cnt;//cnt间隙数量,r空格数(maxWidth - len多减了间隙数,所以要加上cnt)
                line += words[i];
                int k = 0;
                //对平均分配后剩下的数量,从左至右依次多加1
                while(k < r % cnt) line += string(r / cnt + 1,' ') + words[i + k + 1],k++;
                //其余的平均分配
                while(k < cnt) line += string(r / cnt,' ') + words[i + k + 1],k++;
            }
            res.push_back(line);
            i = j - 1;//更新每行起点
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/K_CRACKING/article/details/130295885