剣指offer(C++)——スペースを置き換える


タイトルの説明
文字列のスペースを「%20」に置き換える関数を実装してください.例えば、文字列がWe Are Happyである.置換後の文字列は、We%20 Are%20 Happyである.
構想:簡単な暴力解法で、最初から最後まで文字列を遍歴し、スペースにぶつかったら、まず後ろのすべての文字列を2文字後ろに移動してこそ、3文字の位置を空けて文字「%20」を挿入することができ、1つの長さnの文字列に対して、各スペースに対して、後面O(n)文字を移動する必要があるため、n個のスペースを含む文字列は、総時間の複雑度はO(n*n)である.
角度を変えて、私たちは後ろから前に置き換えて、まず文字列を1回遍歴して、スペースの個数を統計して、それによって置き換えた文字列の長さを計算することができます.次に、再び文字列を後から先へ巡回し、2つのポインタP 1とP 2を同時に設定し、P 1は元の文字列の末尾を指し、P 2は置換後の文字列の末尾を指す.P 1を前に移動し、最初のスペースにぶつかるまで、その指す文字をP 2の指す位置にコピーします.そしてP 1を1マス前に移動し、P 2の前に文字列「%20」を挿入し、同時にP 2を3マス前に移動する.すべてのスペースが置換されるまで、この手順を繰り返します.この方法の時間的複雑さはO(n)である.
コード実装:
class Solution {
public:
	void replaceSpace(char *str, int length) {
		if (str == NULL || length < 0)
			return;
		else
		{
			int numoforiginal = 0;            //         
			int numofspace = 0;                //       
			int i = 0;
			while (str[i] != '\0')
			{
				numoforiginal++;               //       
				if (str[i++] == ' ')
					numofspace++;              //   
			}
			int newoflength = numoforiginal + numofspace * 2;
			if (newoflength > length)
				return;

			//        
			int indexoforiginal =numoforiginal;                          
			int indexofnew = newoflength;
			while (indexoforiginal >= 0 && indexofnew > indexoforiginal)
			{
				if (str[indexoforiginal] == ' ')
				{
					str[indexofnew--] = '0';
					str[indexofnew--] = '2';
					str[indexofnew--] = '%';
				}
				else
					str[indexofnew--] = str[indexoforiginal];
				indexoforiginal--;
			}
		}
	}
};