侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

LeetCode 68. 文本左右对齐

Hope
2022-02-20 / 0 评论 / 0 点赞 / 445 阅读 / 912 字
温馨提示:
本文最后更新于 2022-02-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

LeetCode 68. 文本左右对齐

思路:
首先记录一下当前行可以放多少个单词,并记录下单词以及两个单词之间空格的长度,对统计好的长度进行分析,有两种情况,第一种是左对齐,即当前行只有一个单词或者已经到了最后几个单词,虽然可以再放,但是单词的个数已经不够了。第二种情况是两边左右对齐。

代码:

class Solution {
public:
    vector<string> fullJustify(vector<string>& words, int maxWidth) {
        vector<string> res;
        int n=words.size();

        for(int i=0;i<n;i++){
            //首先看一下每一行可以放多少个单词。
            int j=i+1;
            int len=words[i].size();
            //还要算上两个单词之间的空格
            while(j<n && words[j].size() + 1 + len <= maxWidth) 
                len+=(words[j++].size() + 1);

            //判断两种情况
            //左对齐 单词数量不够 只有一个单词
            string line;
            if(j == n || i + 1 == j){
                line+=words[i];
                
                int k=i+1;
                while(k<j) line+=' ' + words[k++];
                while(line.size() < maxWidth) line+=' ';
            }
            //左右对齐
            else{
                //因为空格的数量不一定是均匀分布在每个空隙 所以如果出现多余的空格需要放在前面
                //t 空隙个数  r空格个数 把 r%t 即多余的空格放在前面 剩下的均匀分布
                int cnt=j-i-1, r=maxWidth-len+cnt;
                
                line += words[i];

                int k=0;
                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);
            //for循环中 还有一次 i++
            i=j-1;
        }
        return res;
    }
};
0

评论区