题目
请实现一个函数,把字符串中的每个空格替换成”%20”。
你可以假定输入字符串的长度最大是1000。
注意输出字符串的长度可能大于1000。
样例
输入:”We are happy.”
输出:”We%20are%20happy.”

解法一:复制到新str

简单粗暴
时间复杂度O(n),空间复杂度O(n)

  1. class Solution {
  2. public:
  3. string replaceSpaces(string &str) {
  4. string ans;
  5. for (int i = 0; i < str.size(); i++) {
  6. if (str[i] == ' ')
  7. ans += "%20";
  8. else ans += str[i];
  9. }
  10. return ans;
  11. }
  12. };

解法二:从后往前就地双指针

求出string最终长度,然后从后往前修改字符串,和从前往后的方式相比,避免了数组的移动
这在合并两个数组或者是字符串当中是一种比较通用的做法,可以有效避免移动
时间复杂度O(n),空间复杂度O(1)

resize:改变容器的size,并将空间初始化,可以直接访问 reserve:改变容器的capacity,就是预分配的空间大小,没有被初始化,不可以直接访问

  1. class Solution {
  2. public:
  3. string replaceSpaces(string &str) {
  4. int len = 0;
  5. for (auto c: str) {
  6. if (c == ' ')
  7. len += 3;
  8. else len++;
  9. }
  10. int i = str.size() - 1, j = len - 1;
  11. str.resize(len);
  12. while (i >= 0) {
  13. if (str[i] == ' ') {
  14. str[j--] = '0';
  15. str[j--] = '2';
  16. str[j--] = '%';
  17. }
  18. else
  19. str[j--] = str[i];
  20. i--;
  21. }
  22. return str;
  23. }
  24. };