《剑指offer》在字符串中替换另一个字符串

将字符串中的某些字符做替换

一、简介

  • 将一个字符串中的,某一个字符或者字符串替换成另一个字符或字符串。
  • 根据《剑指offer》中讲到的思想,下面来做一个分析。
  1. 我们可以先遍历一次字符串,这样就能计算出替换之后的字符串的总长度。也就是说,如果我们原来字符串中的某一个字符替换成某一个更长的,那么替换之后字符串的总长度就会变长。此一步骤的目的就是,计算出替换后总长度,才好分配内存去存储。

    例如:将hello world中的字符’l’替换成"handsome",那么经过检查会发现字符串中的’l’的数量为三个,替换成"handsome"后长度增加了7,那么一共有三个’l’需要替换,那么原空间就需要增加21。

  2. 我们从字符串的后面开始复制和替换。首先需要准备两个指针:p1,P2。P1指向原字符串的末尾,而P2指向替换之后的字符串的末尾。这样通过一前一后两个指针,就将所有的字符移动了一遍。当左后p1==p2时,所有的字符就被替换完了。

    具体步骤:

    1. 第一个指针指向字符串的末尾,将第二个指针指向替换之后的字符串的末尾,把第二个指针指向替换之后的字符串的末尾。
    2. 依次赋值字符串的内容,直至第一个之好着呢碰到第一个需要替换的字符串。
    3. 将第一个需要替换的字符替换成需要替换的字符串。指针p1向前移动一,指针p2向前移动向应的长度。
    4. 依次向前赋值字符串中字符,直到遇到下一个需要替换的字符。
    5. 当最后两个指针相遇的时候,表示全部的字符都被替换完成。

二、代码

  • 下面给参考代码:

    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;
    }
}
  1. 拓展

    本例给了一种很好的思路,从后往前查找字符串,有效的减少了时间复杂度。利用两个指针来对字符串进行处理,对很多字符串问题都有不错的启示作用。

发布了49 篇原创文章 · 获赞 15 · 访问量 9266

猜你喜欢

转载自blog.csdn.net/wit_732/article/details/99218076