字符替换和删除
参考:http://zhedahht.blog.163.com
- 请实现一个函数,把字符串中的每个空格替换成%20。
- 输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符。
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 }