字符替换和删除

参考:http://zhedahht.blog.163.com

  1. 请实现一个函数,把字符串中的每个空格替换成%20。
  2. 输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。

1、思路:

  两题遇到的问题都是无论是替换还是删除,都会导致之后的字符需要整体移动,如何在O(n)的时间复杂度下完成操作,往往需要两个指针。这题先遍历一遍记录下空格数,然后设置两个指针,一个指针指向替换成%20之后的末尾,一个指针指向原始字符串的末尾。两个指针同时往前移,并前指针的内容拷贝到后指针的位置。前指针遇到空格,后指针填充%20,然后两个指针继续往前移,终止条件是前指针和后指针重合。

ReplaceBlank
 1 void ReplaceBlank(char string[], int length)
 2 {
 3     if(string == NULL && length <= 0)
 4         return;
 5 
 6     /*originalLength 为字符串string的实际长度*/
 7     int originalLength = 0;
 8     int numberOfBlank = 0;
 9     int i = 0;
10     while(string[i] != '\0')
11     {
12         ++ originalLength;
13 
14         if(string[i] == ' ')
15             ++ numberOfBlank;
16 
17         ++ i;
18     }
19 
20     /*newLength 为把空格替换成'%20'之后的长度*/
21     int newLength = originalLength + numberOfBlank * 2;
22     if(newLength > length)
23         return;
24 
25     int indexOfOriginal = originalLength;
26     int indexOfNew = newLength;
27     while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
28     {
29         if(string[indexOfOriginal] == ' ')
30         {
31             string[indexOfNew --] = '0';
32             string[indexOfNew --] = '2';
33             string[indexOfNew --] = '%';
34         }
35         else
36         {
37             string[indexOfNew --] = string[indexOfOriginal];
38         }
39 
40         -- indexOfOriginal;
41     }
42 }

 

2、思路:

  首先将后一个字符串的字符预处理成hashtable,然后设置两个指针分别指向第一个字符串的首地址。快指针遇到hashtable中的字符跳过,慢指针一步一步往前移,两者同步往前移动,每移动一次快指针将内容拷贝到慢指针的地方,终止条件是快指针到达\0字符。

DeleteChars
 1 void DeleteChars(char* pStrSource, const char* pStrDelete)
 2 {
 3       if(NULL == pStrSource || NULL == pStrDelete)
 4             return;
 5 
 6       const unsigned int nTableSize = 256;
 7       int hashTable[nTableSize];
 8       memset(hashTable, 0, sizeof(hashTable));
 9  
10       const char* pTemp = pStrDelete;
11       while ('\0' != *pTemp)
12       {
13             hashTable[*pTemp] = 1;
14             ++ pTemp;
15       }
16  
17       char* pSlow = pStrSource;
18       char* pFast = pStrSource;
19       while ('\0' != *pFast)
20       {
21             if(1 != hashTable[*pFast])
22             {
23                   *pSlow = *pFast;
24                   ++ pSlow;
25             }
26             ++pFast;
27       }
28       *pSlow = '\0';
29 }

 

 

posted on 2013-04-16 19:46  月moon鸟  阅读(288)  评论(0编辑  收藏  举报

导航