剑指offer-字符串

1.替换空格

问题描述:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

class Solution {
public:
	void replaceSpace(char *str,int length) {
        string s(str);
        string temp;
        for(auto c : s){
            if(isspace(c))
                temp += "%20";
            else
                temp += c;
        }
        auto res = temp.c_str();
        strcpy(str,res);
	}
};
  • c_str()
    • string成员函数
    • 函数原型:const char *c_str()const;   //返回一个以null终止的c字符串
    • 作用:将一个string对象转换为正规的c字符串
    • 注意:返回的是一个临时的指针变量,不能对其进行操作。
  • strcpy()
    • 函数原型 :char *strcpy(char *dest,const char *src)
    • 作用:从src地址开始且含有null结束符的字符串复制到以dest地址开始的字符串中,并返回指向dest的指针。如果dest中有数据小于src地址长度的将会被覆盖,而大于src长度的将保留。
    • 注意:dest的地址长度要足够大,不然会产生溢出。Dest的内存长度要大于等于src的内存长度。

关于c++中string和char *的区别参考:https://www.cnblogs.com/tsingke/p/12075078.html

2.正则表达式匹配

问题描述:

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

思路:

  • 字符串str为空且模式pattern为空,返回true
  • 字符串str不为空,模式为空,返回false(空字符串可以匹配一个空的模式,非空字符串不能匹配一个空模式)
  • str与pattern进行匹配,考虑pattern下一个字符是否为*:
    • 如果是*
      • str与pattern匹配(字符=字符/字符=.),接下来有三种匹配方式:​​​​​​​
        • str不动,pattern右移两位(*表示出现0次)
        • str右移一位,pattern右移两位(*表示出现1次)
        • str右移一位,pattern不动(*表示出现多次)
      • str与pattern不匹配:str不动,pattern右移两位(*表示出现0次)
    • 如果不是*
      • str与pattern匹配(字符=字符/字符=.):str右移一位,pattern右移一位
      • str与pattern不匹配:返回false

代码:

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*str == '\0' & *pattern == '\0')
            return true;
        if(*str != '\0' & *pattern == '\0')
            return false;
        if(*(pattern+1) !='*'){
            if(*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str+1,pattern+1);
            else
                return false;
        }
        else{
            if(*str == *pattern || (*str != '\0' and *pattern == '.'))
                return match(str+1,pattern) || match(str,pattern+2);
            else
                return match(str,pattern+2);
        }
    }
};

3.表示数值的字符串

问题描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

class Solution {
public:
    bool isNumeric(char* string)
    {
        //空串false
        if(*string == '\0')
            return false;
        //只包含+/-
        if(*string=='+' || *string=='-')
           string++;
        if(*(string +1)=='\0')
            return false;
        //字符串表示数值的格式:+/-(0~9).(0~9)e/E +/-(0/9)
        bool dot=false,num=false,nume=false; //标记是否有小数点、整数部分、e指数存在
        while(*string != '\0'){
            if(*string>='0' && *string<='9'){
                string++;
                num=true;
            }
            else{
                //小数点前不能出现小数点和e
                if(*string=='.'){
                    if(dot || nume)
                        return false;
                    string++;
                    dot=true;
                }
                else{
                    //e前必须有整数,不能有e
                    if(*string=='e' || *string=='E'){
                        if(num==false || nume )
                            return false;
                        string++;
                        nume=true;
                        //e后可以出现+/-,除第一位+/-只能出现在e后面
                        if(*string=='+' || *string=='-')
                            string++;
                        //e后有必须有整数
                        if(*string=='\0')
                            return false;
                    }
                    else
                        //字符不为数字、.、e/E
                        return false;
                }
            }
        }
        return true;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值