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右移一位
- 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;
}
};