leetcode_068 Text Justification

题目分析:输入一个字符串数组和一个规定长度L。将这个字符串数组的元素尽可能放到长度为L的字符串中,数组中的字符串不能拆开,一个长度L的字符串包括的若干个字符串之间用空格间隔开。放置空格的原则为:左边的空格要多于右边的空格,最后一行靠左对齐。

解题思路:

                    1)非最后一行,如果只有一个单词,单词靠左放置,右边放空格;

                    2)非最后一行,如果有多个单词,计算间隔n、多于空格s(每个单词间放一个空格多出的空格数),

                          每个间隔在多方s/n个,前s%n个间  隔在多方个空格;

                    3)最后一行中,单词之间只有一个空格,其余空格全部在最右边。

举例如下:

                    “This”, “is”, “an”, “example”,“of”,“text”,“justification.”,长度为16。执行结果如下:

                    “This        is        an”

                    “example    of  text”

                    “justification.          "

实现程序:

class Solution 
{
	public:
		// 添加空格函数
		void addSpace(string &s, int count)
		{
			for (int i = 0; i < count; i++)
			{
				s.push_back(' ');
			}
		 } 
		vector<string> fullJustify(vector<string> &words, int maxWidth)
		{
			vector<string> result;
			// 统计字符串中单词数目 
			int len = words.size();
			int i = 0;
			while (i < len)
			{
				// 记录每行单词数目 
				int rowlen = 0;    
				int j = i;
				// 用于统计一行中最多能够放置单词数目n 
				while (j < len && rowlen + words[j].size() <= maxWidth)
				{
					rowlen += (words[j++].size() + 1); 
				} 
				// 处理一行中只能放入一个单词的特殊情况
				if (j - i == 1)  
				{
					result.push_back(words[i]);
					addSpace(result.back(), maxWidth - words[i].size());
					i = j;
					continue;
				}
				// 计算当前行字符的总长度 
				int charLen = rowlen - (j - i);
				// 计算平均每个单词后的空格,其中j < len表示不是最后一行,当为最后一行,则单词间直接放置一个空格 
				int meanSpace = j < len ? (maxWidth - charLen) / (j - i - 1) : 1;
				// 计算每行应该多放置的多于空格,其中j < len表示不是最后一行,但为最后一行,则多于放在一起 
				int leftSpace = j < len ? (maxWidth - charLen) % (j - i - 1) : maxWidth - charLen - (j - i - 1);
				string temp;
				// 放置一行单词,不包括放置最后一个单词 
				for (int k = i; k < j - 1; k++)
				{
					temp += words[k];
					addSpace(temp, meanSpace);
					// 非最后一行放置多于空格 
					if (j < len && leftSpace > 0)
					{
						temp.push_back(' ');
						leftSpace--;
					}
				} 
				// 放置一行中的最后一个单词
				temp += words[j - 1];
				// 最后一行放置最后一个单词 
				if (leftSpace > 0)
					addSpace(temp, leftSpace);
				result.push_back(temp);
				i = j; 
			}
			return result;
		}
};





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值