解题方法:
- 新建字符串,双指针法
- 在
S
上从后往前,双指针法
两种解法时间复杂度一样,都是\(O(n)\),解法二不需要额外的空间
解法一:
- 这里可以通过初始化一个和
S
相同大小的string
来存储新的序列,这里直接用[p2]
来寻址就可以了,最后用erase(int pos, int len)
来删除从pos
开始长度为len
的字符串
- 也可以新建一个空的字符串,用
insert(int pos, string s)
来在pos
处插入string
字符串,或用push_back(char c)
来在string
末尾添加char
字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: string replaceSpaces(string S, int length) { string S2 = S; int p2 = 0; for(int p1=0; p1<length; ++p1) { if(S[p1] != ' ') { S2[p2++] = S[p1]; } else { S2[p2++] = '%'; S2[p2++] = '2'; S2[p2++] = '0'; } } S2.erase(p2); return S2; } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: string replaceSpaces(string S, int length) { string s2; s2 = ""; for(int i=0, j=0; i<length; ++i) { if(S[i] == ' ') { s2.insert(j++, "%"); s2.push_back('2'); j++; s2.insert(j++, "0"); } else { string tmp(1, S[i]); s2.insert(j++, tmp); } } return s2; } };
|
解法二:
因为题目中说S
的长度够长,因此可以利用双指针,一个从S
的末尾开始,一个从给定字符串长度开始,从后往前遍历。最后删掉S
前面多余的部分即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: string replaceSpaces(string S, int length) { int j = S.size() -1; for(int i = length-1; i>=0; --i) { if(S[i] == ' ') { S[j--] = '0'; S[j--] = '2'; S[j--] = '%'; } else { S[j--] = S[i]; } } S.erase(0, j+1); return S; } };
|