LeetCode 68

        Text Justification

   這個題的意思比較簡單,但是情況很複雜,輸入一些列單詞,然後將這些單詞按照規定的長度組合,參照例子大概就可以知道組合的規律,首先分析一下,然後再給出解題思路。這個題的規律如下:

(1).每兩個單詞之間有一個空格,一行中若有些單詞無法完全排列下來就將它放在新的一行中。

(2).最後一行和他之前的所有行有些不一樣,最後一行是按照一個單詞一個空格來排列的;而他之前的每行,若有兩個單詞,則這兩個單詞必須分別在最左和最右端。

我提供兩個測試用例來幫助大家分析容易漏掉的地方:


除了上面兩種情況以外,還有的情況就是: 

  [""]  2         ["  "]    (L的長度爲2,但是提供的只是一個空串,但是返回的結果卻要包含兩個長度,即: ["  "])


解題思路:遍歷單詞數組,統計每個單詞的長度(算上空格的佔位),若是當前位置所在的區間的所有單詞的長度大於題目給定的長度,那麼就需要按照規律插入,就這樣一直執行,最後需要判斷最後一行的處理。

我的解題代碼如下:

class Solution 
{
public:
	vector<string> fullJustify(vector<string>& words, int maxWidth) 
	{
		vector<string> ret;
		ret.clear();

		if (words.size() == 0 || maxWidth <= 0)
		{
			return words;
		}

		int begin = 0; //開始位置
		int end = words.size(); //結束爲止
		int num = 0; //統計每個區間單詞的個數(這個區間就是需要合併的單詞的區間)
		int sz = 0; //統計純單詞的長度
		int bits = 0; //統計包括每個單詞後面跟上空格後的數量
		int offset = 0; //偏移量
		
		while (begin < end)
		{
			int len = words[begin].size();
			
			if (len > maxWidth)
			{
				return vector<string>(1,"");
			}
			
			if (bits + len >maxWidth)
			{ //佔位超過,需要添加
				string tmp = "";
				if (num == 1)
				{//單獨一個的時候需要補齊
					int len = words[offset + num - 1].size();
					tmp = words[offset + num - 1];
					tmp += string(maxWidth - len, ' ');
				}
				else
				{					
					int every = (maxWidth - sz) / (num - 1);
					int left = maxWidth - sz - (num - 1)*every;
					int pos = 0;
					for (int i = 0; i < num-1; ++i)
					{
						tmp += words[offset + i];
						if (pos < left)
						{
							string tb(every + 1, ' ');
							tmp += tb;
						}
						else
						{
							string tb(every, ' ');
							tmp += tb;
						}
						++pos;
					}
					if (num > 0)
					{ //num不爲0
						tmp += words[offset + num - 1];
					}
					else
					{ ////num爲0的特殊情況
						int len = words[offset + num].size();
						tmp += words[offset + num];
						tmp += string(maxWidth - len, ' ');
					}
				}
				ret.push_back(tmp);
				
				if (num > 0) 
					offset += num;
				else
					offset += 1; //num爲0的特殊情況
				
				//統計完一行後需要將以下變量置0
				num = 0; 
				sz = 0;
				bits = 0;
			}
			
			sz += len; //不算空格
			bits += len + 1; //算上空格
			++num;
			++begin;
		}
		
		//最後一行沒有處理,最後一行的格式有別於之前的
		if (offset != end)
		{
			string tmp = "";
			if (num == 1)
			{
				int len = words[offset + num - 1].size();
				tmp = words[offset + num - 1];
				tmp += string(maxWidth - len, ' ');
			}
			else
			{
				int pos = 0;
				for (int i = 0; i < num - 1; ++i)
				{
					tmp += words[offset + i];
					tmp += ' ';
					++pos;
				}				
				tmp += words[offset + num - 1];
				tmp += string(maxWidth - bits + 1, ' '); //空格補齊
			}
			ret.push_back(tmp);
		}

		return ret;
	}
};
程序結果如下:


發佈了194 篇原創文章 · 獲贊 88 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章