您的位置:首页 > 其它

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

2014-07-04 12:08 375 查看


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐