将字符串中的某些字符做替换
一、简介
- 将一个字符串中的,某一个字符或者字符串替换成另一个字符或字符串。
- 根据《剑指offer》中讲到的思想,下面来做一个分析。
-
我们可以先遍历一次字符串,这样就能计算出替换之后的字符串的总长度。也就是说,如果我们原来字符串中的某一个字符替换成某一个更长的,那么替换之后字符串的总长度就会变长。此一步骤的目的就是,计算出替换后总长度,才好分配内存去存储。
例如:将hello world中的字符’l’替换成"handsome",那么经过检查会发现字符串中的’l’的数量为三个,替换成"handsome"后长度增加了7,那么一共有三个’l’需要替换,那么原空间就需要增加21。
-
我们从字符串的后面开始复制和替换。首先需要准备两个指针:p1,P2。P1指向原字符串的末尾,而P2指向替换之后的字符串的末尾。这样通过一前一后两个指针,就将所有的字符移动了一遍。当左后p1==p2时,所有的字符就被替换完了。
具体步骤:
- 第一个指针指向字符串的末尾,将第二个指针指向替换之后的字符串的末尾,把第二个指针指向替换之后的字符串的末尾。
- 依次赋值字符串的内容,直至第一个之好着呢碰到第一个需要替换的字符串。
- 将第一个需要替换的字符替换成需要替换的字符串。指针p1向前移动一,指针p2向前移动向应的长度。
- 依次向前赋值字符串中字符,直到遇到下一个需要替换的字符。
- 当最后两个指针相遇的时候,表示全部的字符都被替换完成。
二、代码
-
下面给参考代码:
1.代码(原书中的代码)
/*
*源代码中是将字符串中的空格换成,"%20"
*/
/*length为字符数组中string的总的容量*/
void ReplaceFunc(char string[],int length)
{
if(string == nullptr||length < 0)
{
return;
}
/*originalLength为字符串string的实际长度*/
int originalLength = 0;
int numberOfBlank = 0;
int i;
while(string[i] != '\0')
{
++originalLength;
if(string[i]==' ')
{
++numberOfBlank;
}
++i;
}
/*newLength为把空格替换成%20之后的长度*/
int newLength = originalLength + numberOfBlank*2;
if(newLength > length)
return;
int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
{
if(string[indexOfOriginal] == ' ')
{
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOfOriginal];
}
--indexOfOriginal;
}
}
-
拓展
本例给了一种很好的思路,从后往前查找字符串,有效的减少了时间复杂度。利用两个指针来对字符串进行处理,对很多字符串问题都有不错的启示作用。