在一个长字符串中删除一个短字符串

转载原文地址:

https://www.cnblogs.com/AndyJee/p/4676608.html

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

这里注意:从一个字符串中删除字符串的时候,如果是通过删除一个字符串就移动后面所有的字符,就非常复杂了。

思路:

通过hash表记录第二个字符串中出现的字符,hash表可以由长度为256的bool数组表示。

然后遍历第一个字符串,每扫描一个字符,通过检查hash表判断该字符是否在第二个字符串出现过,如果是,则删除,否则继续。

那么如果在字符串中删除字符呢?一般而言,每删除一个字符,后面的字符必须往前移,如果每个字符都需要这么操作的话,复杂度就很高了。

解决办法:通过两个指针,一个用于遍历字符串pFast,一个用于删除字符pSlow,当pFast指针所指字符没有在第二个字符串出现过,则*pSlow=*pFast,pSlow++,即保留该位置的字符,否则,pSlow不变,当遍历完字符串之后,*pSlow='\0',以表示删除字符后的新字符串。

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#include <iostream>

 

using namespace std;

 

void deleteChars(char* str1,char* str2){

    if(str1==NULL || str2==NULL)

        return;

    const int tableSize=256;

    bool hashTable[tableSize];

    for(int i=0;i<tableSize;i++)

        hashTable[i]=false;

    //memset(hashTable,0,sizeof(tableSize));

 

    int index;

    while(*str2!='\0'){

        if(*str2>=0)

            index=*str2;

        else

            index=*str2+256;

        hashTable[index]=true;

        str2++;

    }

 

    char* pSlow=str1;

    char* pFast=str1;

    while(*pFast!='\0'){

        if(*pFast>=0)

            index=*pFast;

        else

            index=*pFast+256;

        if(!hashTable[index]){

            *pSlow=*pFast;

            pSlow++;

        }

        pFast++;

    }

    *pSlow='\0';

}

 

int main()

{

    char str1[] = "They are students";

    char str2[] = "Tt";

    deleteChars(str1,str2);

    cout<<str1<<endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值