1、如何在字符串中删除一个字符:
字符串的内存是连续分配的,当我们删除其中一个字符时,就需要把后面所有的字符向前移动一个字节的位置。因此,对于一个长度为n的字符串,删除一个字符的时间复杂度为O(n)。对于本题而言,假设第二个字符串的长度为m,有可能要删除的字符个数是m,因此删除的时间复杂度为O(m*n),即O(n^2)。
我们换一种思路。采用在原字符串基础上重新构造删除后的字符串的思路。定义两个指针,一个slow用来构造新的字符串,一个fast用来遍历原字符串。初始两个指针均指向原字符串的第一个位置。如果fast指向的字符不是要删除的字符,就赋值给slow,然后两个指针一起后移;如果是要删除的,就跳过该字符,fast继续遍历下一个字符,slow不变。这样,删除在O(n)时间内就可以搞定。
-
char * deleteRepeatedChars(char *pString) {
-
if(pString == NULL || strlen(pString) == 1) return pString;
-
//设置一个bool型数组来实现哈希表,key为数组下表(对应字符的ascii码),value为数组下标对应的字符是否已经在字符串中出现过
-
const int tableSize = 256;
-
bool hashTable[ tableSize ];
-
memset(hashTable, 0, sizeof(hashTable));
-
char *slow = pString;
-
char *fast = pString;
-
while( *fast != '\0') {
-
if( !hashTable[ *fast ]) {
-
hashTable[ *fast ] = 1;
-
*slow = *fast;
-
slow ++;
-
}
-
fast ++;
-
}
-
*slow = '\0';
-
return pString;
-
}
-
在这里要注意保存pString