剑指 Offer 05. 替换空格 & C++ String

64 篇文章 0 订阅
32 篇文章 0 订阅

题目

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/50ywkd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路

F1:python方法:

时间复杂度O(N),空间复杂度O(N) 利用split将字符串按照空格split,然后进行concat操作

F2:C++ 方法

由于需要将空格替换为 “%20” ,字符串的总字符数增加,因此需要扩展原字符串 s 的长度,计算公式为:新字符串长度 = 原字符串长度 +
2 * 空格个数 时间复杂度 O(N) : 遍历统计、遍历修改皆使用 O(N) 时间。 空间复杂度 O(1) : 由于是原地扩展 s
长度,因此使用 O(1) 额外空间。

拓展

python和java中 string 是被设计为不可变的,即:即无法直接修改字符串的某一位字符,需要新建一个字符串实现。

在 C++ 语言中, string 被设计成「可变」的类型(参考资料),因此可以在不新建字符串的情况下实现原地修改。

string 变量(对象)的方法

一、自身特性方面的API

//1、功能描述:返回当前容量【即string中在不需要增加内存的情况下还可存放的元素个数】。
int capacity()

//2、功能描述:返回string对象中可存放的最大字符串的长度。
int max_size()

//3、功能描述:返回当前字符串的大小
int size()

//4、功能描述:返回当前字符串的长度
int length()

//5、功能描述:判断当前字符串是否为空
bool empty()

//6、功能描述:把字符串当前大小设置为len,多去少补,字符c填充不足的部分
void resize(int len, char c)

二、关于查找方面的API

//1、功能介绍:返回str在字符串中第一次出现的位置,从index开始查找,如果查找失败,则返回string::npos。
size_type find ( const basic_string &str, size_type index )
size_type find( const char *str, size_type index, size_type length )
size_type find( char ch, size_type index )
//以上的查找功能都是按照从前往后的顺序进行查找,如果想要按照从后往前的顺序进行查找的话,可以用"rfind"语句。

//2、功能介绍:返回str中任意字符在字符串中第一次出现的位置,从位置0开始查找。
size_type find_first_of ( const string& str, size_type pos = 0 )
size_type find_first_of ( const char* s, size_type pos, size_t n )
size_type find_first_of ( const char* s, size_type pos = 0 )
size_type find_first_of ( char c, size_type pos = 0 )

//3、find_first_not_of功能与find_first_of()函数的功能正好相反。得到第一个不是该目标的下标
size_type find_first_not_of ( const string& str, size_type pos = 0 )
size_type find_first_not_of ( const char* s, size_type pos, size_t n )
size_type find_first_not_of ( const char* s, size_type pos = 0 )
size_type find_first_not_of ( char c, size_type pos = 0 )
    
//4、find_last_of 与find_first_of()函数相比而言,其不同的地方在于:find_last_of()是找出最后一个相同的位置。
size_type find_last_of(...)
    
//5、find_last_not_of()与find_last_of()功能函数正好相反。得到最后一个不是该目标的下标
size_type find_last_not_of(...)

三、其他方面的函数

//1、功能介绍:在p位置插入字符串s
string &insert(int p,const string &s)

//2、功能介绍:删除从p开始的n个字符,然后在p处插入字符串s
string &replace(int p, int n,const char *s)

//3、功能介绍:删除p开始的n个字符,返回修改后的字符串
string &erase(int p, int n)

//4、功能介绍:返回pos开始的n个字符组成的字符串
string substr(int pos, int n ) 

//5、功能介绍:交换当前字符串与s2的值
void swap(string &s2)

//6、功能介绍:把字符串s连接到当前字符串结尾
string &append(const char *s)

//7、功能介绍:当前字符串尾部加一个字符c
void push_back(char c)

//8、功能介绍:返回一个非null终止的c字符数组,data():与c_str()类似,用于string转const char*其中它返回的数组是不以空字符终止。
const char *data()

//9、返回一个以null终止的c字符串,即c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,用于string转const char *
const char *c_str()  

参考:https://blog.csdn.net/weixin_42295814/article/details/109800938

源码

//F1:python方法,时间复杂度O(N),空间复杂度O(N)
// 利用split将字符串按照空格split,然后进行concat操作
//拓展:python和java中 string 是被设计为不可变的,即:即无法直接修改字符串的某一位字符,需要新建一个字符串实现。
class Solution(object) :
    def replaceSpace(self, s) :
    """
    : type s : str
    :rtype: str
    """
    res = ""
    str_list = s.split(" ")
    res = str_list[0]

    for i in range(1, len(str_list)) :
        res = res + "%20" + str_list[i]
        return res

//F2:C++
//在 C++ 语言中, string 被设计成「可变」的类型(参考资料),因此可以在不新建字符串的情况下实现原地修改。
//由于需要将空格替换为 "%20" ,字符串的总字符数增加,因此需要扩展原字符串 s 的长度,计算公式为:新字符串长度 = 原字符串长度 + 2 * 空格个数
//时间复杂度 O(N) : 遍历统计、遍历修改皆使用 O(N) 时间。
//空间复杂度 O(1) : 由于是原地扩展 s 长度,因此使用 O(1) 额外空间。
class Solution {
public:
    string replaceSpace(string s) {
        //遍历原先字符串查找空格个数
        int counter = 0;
        for (char c : s) {
            if (c == ' ') {
                counter++;
            }
        }

        //调整原先字符串大小 为 len + 2*count
        int len = s.size();
        s.resize(len + 2 * counter);
        //cout << s;

        //逆序遍历字符串
        int i, j;
        for (i = len, j = len + 2 * counter; j > i; i--, j--) {
            //i用于遍历索引原先字符串,j用于遍历索引新字符串
            if (s[i] != ' ') {
                s[j] = s[i];
            }
            else {
                s[j--] ='0' ;
                s[j--] = '2';
                s[j] = '%';
            }
        }


        return s;
       
    }
};





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值