leetcode——Reverse Words in a String 旋轉字符串中單詞順序(AC)

題目如下:

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

click to show clarification.

Clarification:

  • What constitutes a word?
    A sequence of non-space characters constitutes a word.
  • Could the input string contain leading or trailing spaces?
    Yes. However, your reversed string should not contain leading or trailing spaces.
  • How about multiple spaces between two words?
    Reduce them to a single space in the reversed string.
題目要求不僅需要把字符串中的單詞進行旋轉,而且測試用例中還包含頭尾含有空格、單詞間空格數大於1個之類的字符串。所以要處理好空格,處理完空格的字符串肯定是小於或等於原字符串長度的,考慮到通過移動字符的方式來減小空格耗時長,我的思路是首先計算出去多餘的空格後字符串應有的長度,然後重新定義一個臨時字符串,開闢最終應有長度的空間。然後將原字符串逆序copy到新定義的字符串變量中,保證頭尾多餘空格已去除,保證單詞間僅保留一個空格。然後將每個單詞再進行一次反轉,便實現了題目所要求的功能。AC代碼如下:
class Solution {
public:
    void reverseWords(string &s) 
	{
		if(s.empty())
			return;
		int count = 0;
		int index = 0, indexTemp = 0, begin = 0, end = s.length()-1;
		while(s[begin] == ' ' && begin<s.length()-1)
			begin++;
		while(s[end] == ' ' && end>0)
			end--;
		if(end == 0 && s[end] == ' ')
		{
			s = "";
			return;
		}
		else if(end == 0)
		{
			s = s.substr(0,1);
			return;
		}
		index = begin;
		while(index <= end)
		{
			if(s[index] == ' ')
			{
				count++;
				while(s[index] == ' ')
					index++;
			}
			count++;
			index++;
		}
		string temp(count,'\0');
		index = end;
		indexTemp = 0;
		while(index >= begin)
		{
			if(s[index] == ' ')
			{
				temp[indexTemp] = s[index];
				while(s[index] == ' ')
					index--;
				indexTemp++;
			}
			temp[indexTemp] = s[index];
			indexTemp++;
			index--;
		}
		indexTemp = 0;
		begin = -1;
		end = -1;
		while(indexTemp < count)
		{
			if(temp[indexTemp] != ' ' && begin == -1)
			{
				begin = 0;
			}
			else if(indexTemp-1 >= 0 && temp[indexTemp-1] == ' '&&temp[indexTemp] != ' ')
			{
				begin = indexTemp;
			}
			else if((indexTemp+1 < count && temp[indexTemp+1] == ' ' && temp[indexTemp] != ' ') || ((indexTemp == count-1)&&temp[indexTemp] != ' '))
			{
				end = indexTemp;
				reverse(temp, begin, end);

			}
			indexTemp++;
		}
		s = temp;
    }
	
	void reverse(string &s, int begin, int end)
	{
		while(begin < end)
		{
			char temp = s[begin];
			s[begin] = s[end];
			s[end] = temp;
			begin++;
			end--;
		}
	}
};



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