给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' '
填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
说明:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组
words
至少包含一个单词。
示例:
输入: words = ["This", "is", "an", "example", "of", "text", "justification."] maxWidth = 16 输出: [ "This is an", "example of text", "justification. " ]
示例 2:
输入: words = ["What","must","be","acknowledgment","shall","be"] maxWidth = 16 输出: [ "What must be", "acknowledgment ", "shall be " ] 解释: 注意最后一行的格式应为 "shall be " 而不是 "shall be", 因为最后一行应为左对齐,而不是左右两端对齐。 第二行同样为左对齐,这是因为这行只包含一个单词。
示例 3:
输入: words = ["Science","is","what","we","understand","well","enough","to","explain", "to","a","computer.","Art","is","everything","else","we","do"] maxWidth = 20 输出: [ "Science is what we", "understand well", "enough to explain to", "a computer. Art is", "everything else we", "do " ]
解题思路:
捋一捋,本题需要解决的问题如下:
1.在一个固定长度的字符串中后续插入一个单词,保证单词之间至少一个空格。
2.将一个字符串左右对齐。
为了方便解决这个问题,我觉得应该写个class ,如下:
class str_cell {
public:
str_cell() { Remain = maxWidth; num = 0; }
bool insert(string s);//当前数据中插入一个单词s,成功插入返回true。
void clear();//清空字符串,将所有数据回到初始化的值
void Align();//将str左右对齐
string str;//当前字符串
int Remain;//剩余的空格
int num;//单词个数
static int maxWidth;//字符串的宽度,所有字符串一致
};
其中maxWidth是每个单词的最大长度,在本题中每个单词的最大长度一致,因此在这里设置成静态的变量。
bool insert(string s);
插入函数bool insert(string s)较为简单,判断当前空格个数是否能够插入当前单词即可。注意首个单词特殊!因为在外部需要判断是否已经成功插入,因此需要返回bool类型的变量。
void clear();
清空字符串用于当前的对象数据还原,避免多次创建数据类型。一般的算法设计中提到对一个对象赋值要比创建这个对象快很多。因此这是个细节操作。
void Align();
字符串左右对齐是本题的重点,也是难点。实际上我们只需要把末尾剩余de 空格插入到前面的单词间隙中即可,因此我们需要知道字符串中的单词个数以及末尾剩余的空格数量,这也是在class中设置这两个成员的原因。
1. 如果单词只有一个直接返回即可。
2. 可插入的位置exist=num-1。每个位置插入的空格数至少是Remain/exist个,剩下的Remian%exist个应该尽量往前放置(题意:均匀而靠前)。
注意,最后一个字符串是不用左右对齐的,此后,对所有长度小于maxWidth的字符串用空格补齐,此题的处理就结束了。
class str_cell { class Solution { |