2020-08-07

1、如何在字符串中删除一个字符:

字符串的内存是连续分配的,当我们删除其中一个字符时,就需要把后面所有的字符向前移动一个字节的位置。因此,对于一个长度为n的字符串,删除一个字符的时间复杂度为O(n)。对于本题而言,假设第二个字符串的长度为m,有可能要删除的字符个数是m,因此删除的时间复杂度为O(m*n),即O(n^2)。

我们换一种思路。采用在原字符串基础上重新构造删除后的字符串的思路。定义两个指针,一个slow用来构造新的字符串,一个fast用来遍历原字符串。初始两个指针均指向原字符串的第一个位置。如果fast指向的字符不是要删除的字符,就赋值给slow,然后两个指针一起后移;如果是要删除的,就跳过该字符,fast继续遍历下一个字符,slow不变。这样,删除在O(n)时间内就可以搞定。

  1. char * deleteRepeatedChars(char *pString) {

  2. if(pString == NULL || strlen(pString) == 1) return pString;

  3. //设置一个bool型数组来实现哈希表,key为数组下表(对应字符的ascii码),value为数组下标对应的字符是否已经在字符串中出现过

  4. const int tableSize = 256;

  5. bool hashTable[ tableSize ];

  6. memset(hashTable, 0, sizeof(hashTable));

  7.  
  8. char *slow = pString;

  9. char *fast = pString;

  10. while( *fast != '\0') {

  11. if( !hashTable[ *fast ]) {

  12. hashTable[ *fast ] = 1;

  13. *slow = *fast;

  14. slow ++;

  15. }

  16.  
  17. fast ++;

  18. }

  19. *slow = '\0';

  20.  
  21. return pString;

  22. }

  23. 在这里要注意保存pString

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值