您的位置:首页 > 职场人生

剑指Offer----面试题35:扩展----第一个字符串中删除第二个字符串中出现过的所有字符

2016-08-01 11:38 453 查看

题目:

定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如从第一个字符串"We are students"中删除第二个字符串“aeiou”中出现过的字符得到的结果就是“W r stdnts”。

分析:

为了解决这个问题,我们可以创建一个用数组实现的简单哈希表来存储第二个字符串。这样我们从头到尾扫描第一个字符串中的每一个字符时,用O(1)时间就能判断出该字符是不是在第二个字符中。如果第一个字符串的长度时n,那么总的时间复杂度就是O(n)。

源代码如下:
#include<iostream>

using namespace std;

char * Function(char *str1, char *str2)
{
if (str1 == nullptr || str2 == nullptr)
return str1;

const int tableSize = 256;
unsigned int hashTable[tableSize] = { 0 };
for (int i = 0; i < tableSize; ++i)
hashTable[i] = 0;

char *pHashKey = str2;
while (*pHashKey != '\0')
hashTable[*(pHashKey++)]++;

int len1 = strlen(str1);
char *temp = (char *)malloc(len1*sizeof(char));
temp[len1] = '\0';
int j = 0;
for (int i = 0; i < len1; ++i)
{
if (hashTable[str1[i]] == 0)
temp[j++] = str1[i];
}
temp[j] = '\0';
return temp;
}

int main()
{
char str1[] = "We are students";
char str2[] = "aeiou";
char *str3 = Function(str1, str2);
cout << "输出结果为" << str3 << endl;
system("pause");
return 0;
}


运行结果:
输出结果为W r stdnts
请按任意键继续. . .


注意:上述程序有内存泄漏的风险,下一步工作应该优化该代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer C++ 哈希表
相关文章推荐