剑指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 面试题35扩展:删除字符串中所有重复出现的字符 (C++版)
- 剑指offer 面试题35扩展:从第一个字符串中删除第二个字符串中的所有字符 (C++版)
- 剑指Offer:从第一个字符串中删除第二个字符串中出现过的所有字符
- 剑指offer相关题目,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符
- 剑指Offer----面试题35:扩展----删除字符串中所有重复出现的字符 & 变位词
- 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
- 剑指Offer面试题35(java版):第一个只出现一次的字符
- 剑指offer 面试题35 第一个只出现一次的字符
- sql 语句 写一个函数T-sql函数elimination(a,b)将出现在第一个字符串中的第二个字符串中的所有字符删除,即:select dbo.elimination('abcdefg123
- 输入两个字符串,从第一个字符串中删除第二个字符串中出现过的所有字符
- 剑指offer——面试题35:第一个只出现一次的字符(哈希)
- 剑指offer 面试题35 第一个只出现一次的字符(C++版)
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题35:第一个只出现一次的字符
- 剑指offer 面试题35—第一个只出现一次的字符
- [剑指offer][面试题35]第一个只出现1次的字符
- 从第一个字符串中删除第二个字符串中出现的所有字符
- 从第一个字符串中删除在第二个字符串中出现过的所有字符
- 在第一个字符串中删除在第二个字符串中出现的所有字符
- 剑指Offer----面试题35:第一个只出现一次的字符
- 【剑指offer】面试题35-第一个只出现一次的字符