文章目录
- 一、题目
- 二、双指针法
- 三、完整代码
所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
一、题目
二、双指针法
思路分析:这道题使用双指针法就能不用额外的辅助空间。首先计算字符串中的空格数量,然后重设字符串的空间。之后i指针指向新设空间的末尾,j指向旧字符串空间的末尾,碰到非空格字符的直接更新i指针内容,反之将i指针指向的前三个字符改成%20。你肯定想问为什么不从前往后填充呢?从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
大部分数组填充类的问题,一般都是预先给数组扩容,然后从后往前进行操作。这样的操作有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
程序如下:
class Solution {
public:
// 双指针法将空格替换成%20
string replaceSpace(string s) {
// 计算空格数量,重设数组大小
int count = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == ' ') count++;
}
if (!count) return s; // 没有空格直接返回
s.resize(s.size() + 2 * count);
// 替换操作
for (int i = s.size() - 1, j = s.size() - 2 * count - 1; i >= 0; --j,--i) {
if (s[j] != ' ') {
s[i] = s[j];
}
else {
s[i--] = '0';
s[i--] = '2';
s[i] = '%';
}
}
return s;
}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
三、完整代码
# include <iostream>
# include <string>
using namespace std;
class Solution {
public:
// 双指针法将空格替换成%20
string replaceSpace(string s) {
// 计算空格数量,重设数组大小
int count = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == ' ') count++;
}
if (!count) return s; // 没有空格直接返回
s.resize(s.size() + 2 * count);
// 替换操作
for (int i = s.size() - 1, j = s.size() - 2 * count - 1; i >= 0; --j,--i) {
if (s[j] != ' ') {
s[i] = s[j];
}
else {
s[i--] = '0';
s[i--] = '2';
s[i] = '%';
}
}
return s;
}
};
int main() {
string s = "We are happy.";
cout << "目标字符串:" << s << endl;
Solution s1;
s = s1.replaceSpace(s);
cout << "替换空格后的字符串:" << s << endl;
system("pause");
return 0;
}
end