HWOJ 在一个字符中删除第二个字符出现过的所有字符

HWOJ 在一个字符中删除第二个字符出现过的所有字符

题目:
在第一个字符中删除第二个字符出现过的所有字符
实例:
第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
题目分析:
①本题需要完成工作就是查找和删除
②查找字符
我们可以使用先去遍历第一个字符,之后再去第二个字符中去查到到底存在不存在,这样复杂度为O(mn)所以,创建一个用数组实现的简单的哈希表来实现查找,查找最快的就是hash表
②删除字符
后面的字符要往前移,如果每删除一个就移一次,O(n^2)这复杂度实在太高,仅仅用快慢指针就可以搞定,这个方法非常有用,比如求解循环链表。利用快慢指针来删除字符,如果快指针指的是不需要的字符,将值赋给慢指针后,快慢指针同时++;如果快指针指向待删除字符,那么直接++;
③这里还需要注意的输入的字符中又空格,所以我们使用gets,注意需要加头文件#include<string.h>
学习笔记:
①查找字符可以利用哈希表保持目标字符串,之后看看哈希表的键值,我们就可以推断出它出现否,或者出现几次。
②删除字符,我们可以用快慢指针来完成,首先定义这个字符串首地址为slow fast
*fast指向出现过的字符如果没有出现过,我们只需要将将快指针给慢指针,之后慢指针加1;如果出现过,则我们直接把快指针加1。

============================================================================
参考代码:

//.cpp
#include <iostream>  
#include <string>  
using namespace std;  

//删除出现字符串  
char DeletingChar(char *str1,char *str2)  
{  
    //输入不合法  
    if(str1 == NULL || str2 == NULL)  
        return 0;  

    //创建一个哈希表,并且初始化  
    const int tableSize = 256;  
    unsigned int hashTable[tableSize];  
    for(int i = 0;i < tableSize;i++)  
        hashTable[i] = 0;  

    //用哈希表储存第二个字符串  
    char *pHashKey = str2;  
    while(*pHashKey)  
    {  
        hashTable[*pHashKey] = 1;  
        pHashKey++;  
    }  

    char *slow = str1;  
    char *fast = str1;  
    while(*fast)  
    {  
        if(hashTable[*fast] == 0)  
        {  
            *slow = *fast;  
            slow++;  
        }  

        fast++;  
    }  
    *slow = '\0';  
}  

int main()  
{  
    char first[1000],second[1000];  
    gets(first);  
    gets(second);  

    DeletingChar(first, second);  
    cout << first << endl;  
    return 0;
} 

  
  
——To_捭阖_youth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值