16. 替换空格

文章介绍了两种方法实现将字符串中的每个空格替换为%20。第一种是线性扫描,适用于C++,需要额外分配空间。第二种是双指针扫描,适用于支持动态数组扩展的语言,空间效率更高。两种方法的时间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

请实现一个函数,把字符串中的每个空格替换成"%20"

数据范围

0≤0≤ 输入字符串的长度 ≤1000。

注意输出字符串的长度可能大于 1000。

样例
输入:"We are happy."

输出:"We%20are%20happy."

解决方案:

算法1

(线性扫描) O(n)

这个题在C++里比较好做,我们可以从前往后枚举原字符串:

如果遇到空格,则在string类型的答案中添加 "%20";

如果遇到其他字符,则直接将它添加在答案中;

但在C语言中,我们没有string这种好用的模板,需要自己malloc出char数组来存储答案。

此时我们就需要分成三步来做:

遍历一遍原字符串,计算出答案的最终长度;

malloc出该长度的char数组;

再遍历一遍原字符串,计算出最终的答案数组;

时间复杂度分析

原字符串只会被遍历常数次,所以总时间复杂度是 O(n)。

class Solution {
public:
    string replaceSpaces(string &str) {
        string res;
        for (auto x : str)
            if (x == ' ')
                res += "%20";
            else
                res += x;
        return res;
    }
};

算法2

(双指针扫描) O(n)

在部分编程语言中,我们可以动态地将原数组长度扩大,此时我们就可以使用双指针算法,来降低空间的使用:

首先遍历一遍原数组,求出最终答案的长度length;

将原数组resize成length大小;

使用两个指针,指针i指向原字符串的末尾,指针j指向length的位置

两个指针分别从后往前遍历,如果str[i] == ' ',则指针j的位置上依次填充'0', '2', '%',这样倒着看就是"%20";如果str[i] != ' ',则指针j的位置上填充该字符即可。

由于i之前的字符串,在变换之后,长度一定不小于原字符串,所以遍历过程中一定有i <= j,这样可以保证str[j]不会覆盖还未遍历过的str[i],从而答案是正确的。

时间复杂度分析

原字符串只会被遍历常数次,所以总时间复杂度是 O(n)。

class Solution {
public:
    string replaceSpaces(string &str) {

        int len = 0;
        for (auto c : str)
            if (c == ' ')
                len += 3;
            else
                len ++ ;

        int i = str.size() - 1, j = len - 1;

        str.resize(len);

        while (i >= 0)
        {
            if (str[i] == ' ')
            {
                str[j -- ] = '0';
                str[j -- ] = '2';
                str[j -- ] = '%';
            }
            else str[j -- ] = str[i];
            i -- ;
        }
        return str;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值