• [LeetCode] Text Justification


    Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.

    You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactlyL characters.

    Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.

    For the last line of text, it should be left justified and no extra space is inserted between words.

    For example,
    words: ["This", "is", "an", "example", "of", "text", "justification."]
    L: 16.

    Return the formatted lines as:

    [
       "This    is    an",
       "example  of text",
       "justification.  "
    ]
    

    Note: Each word is guaranteed not to exceed L in length.

    click to show corner cases.

    Corner Cases:
      • A line other than the last line might contain only one word. What should you do in this case?
        In this case, that line should be left-justified.
    Hide Tags
     String
     
    思路:在当前节点判断当前能否加入前面的line中,如果能加入(长度不超过L),就update len,如果不能,则计算当前start 到end 的字符串。处理字符串时注意两点,1. 当start==end时,2,当end==n-2,即当前line为最后一行时,另外注意一个技巧,因为我们在当前节点不能处理是,处理start到end,且end==i-1,所以我们要事先压入一个等于L长的字符串才能处理到原有的最后一个字符串。另外,处理完成后,要将i--,重新处理当前i,使其成为first。 整体上感觉不是很难,但要一次写对很难。
    class Solution {
        public:
            vector<string> fullJustify(vector<string> &words, int L)
            {
    
                words.push_back(string(L, 'a'));
                size_t n = words.size();
                int len = 0;
                bool isFirst = true;
                vector<string> res;
                int start = 0, end = 0;
                int remainder = 0;
                string str;
    
    
                for(int i = 0; i < n; i++)
                {
                    if(isFirst)
                    {
                        isFirst = false;
                        len = words[i].size();
                        start = i;
                        //cout << "start	" << start << endl;
                    }
                    else
                    {
                        if(words[i].size() + 1 + len <= L)
                            len += words[i].size() + 1;
                        else
                        {
                            end = i - 1;
                            remainder = L - len;
                            if(start == end) // only one world
                            {
                                str = words[start];
                                for(int j = 0; j < remainder; j++)
                                    str += ' ';
    
                                res.push_back(str);
                                isFirst = true;
                                str.clear();
                                len = 0;
    
                                i--; //handle from the start begin;
                                continue;
                            }
    
                            //cout << "start	" << start << endl;
                            //cout << "end	" << end << endl;
                            //cout << "n	" << n<< endl;
    
                            if(end == n-2) // the last line
                            {
                                for(int j = start; j <= end; j++)
                                {
                                    if(j == start)
                                        str += words[j];
                                    else
                                        str += ' ' + words[j];
                                }
                                for(int j = 0; j < remainder; j++)
                                    str += ' ';
    
                            }
                            else
                            {
                                int average = remainder/(end - start );
                                remainder = remainder%(end - start );
                                for(int j = start; j <= end; j++)
                                {
                                    if(j == start)
                                        str += words[j];
                                    else
                                    {
                                        int tmp = average;
                                        while(tmp > 0)
                                        {
                                            str += ' ';
                                            tmp--;
                                        }
                                        if(remainder > 0)
                                        {
                                            str += ' ';
                                            remainder --;
                                        }
                                        str += ' ';
                                        str += words[j];
                                    }
                                }
                            }
    
                            //cout << "str:" << str<< endl;
                            res.push_back(str);
                            isFirst = true;
                            str.clear();
                            len = 0;
    
                            i--; //handle from the start begin;
                        }
                    }
                    //cout << "len	" << len<< endl;
    
                }
    
                return res;
    
            }
    };
     
  • 相关阅读:
    css mix-blend-mode 混合模式
    vue-slicksort拖拽组件
    123457123457#0#-----com.yuming.TruckCarRun01--前拼后广--大卡车游戏cym
    123457123457#0#---------com.ppGame.SeaPuzzleGame73--前拼后广--宝宝海洋拼图pp
    123457123456#0#-----com.yuming.FromPuzzleGame01--前拼后广--宝宝农场拼图cym
    iOS中NSTimer的使用
    ios排序NSArray(数字.字符串)
    Github排名靠前的iOS库
    mac命令强制清空废纸篓
    我的iOS动画01
  • 原文地址:https://www.cnblogs.com/diegodu/p/4325269.html
Copyright © 2020-2023  润新知