哈希表对字符串的高效处理2:在一个字符中删除第二个字符出现过的所有字符
2014-06-21 23:18
435 查看
哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的方法。
Hash表是使用 O(1) 时间进行数据的插入、删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是 O(N) 。
实例1://功能:在第一个字符中删除第二个字符出现过的所有字符
//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
//思路:1)如果采用先去遍历第一个字符,之后再去第二个字符中去查到到底存在不存在,这样复杂度为O(mn)所以,创建一个用数组实现的简单的哈希表来实现查找,查找最快的就是hash表
2)关于删除字符,后面的字符要往前移,如果每删除一个就移一次,O(n^2)这复杂度实在太高,仅仅用快慢指针就可以搞定,这个方法非常有用,比如求解循环链表。利用快慢指针来删除字符,如果快指针指的是不需要的字符,将值赋给慢指针后,快慢指针同时++;如果快指针指向待删除字符,那么直接++;
参考程序如下:
//功能:在第一个字符中删除第二个字符出现过的所有字符
//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
//思路:创建一个用数组实现的简单的哈希表,之后利用快慢指针来删除字符
#include <iostream>
//#include <stdio.h>
#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';
}
void main()
{
char first[1000],second[1000];
cout << "输入两个字符: ";
//cin.getline(first);
//cin.getline(second);
//getline(cin,first);
//getline(cin,second);
gets(first);
gets(second);
DeletingChar(first, second);
cout << first << endl;
}
注意:c++采用cin输入字符串时,不可以直接利用cin来输入,可以结合getline,或者gets,这里需要注意的是在c中还必须得加上头文件#inlcude<stdio.h>,但是C++中没有必要。
实验结果:
——To_捭阖_youth 23:19
Hash表是使用 O(1) 时间进行数据的插入、删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是 O(N) 。
实例1://功能:在第一个字符中删除第二个字符出现过的所有字符
//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
//思路:1)如果采用先去遍历第一个字符,之后再去第二个字符中去查到到底存在不存在,这样复杂度为O(mn)所以,创建一个用数组实现的简单的哈希表来实现查找,查找最快的就是hash表
2)关于删除字符,后面的字符要往前移,如果每删除一个就移一次,O(n^2)这复杂度实在太高,仅仅用快慢指针就可以搞定,这个方法非常有用,比如求解循环链表。利用快慢指针来删除字符,如果快指针指的是不需要的字符,将值赋给慢指针后,快慢指针同时++;如果快指针指向待删除字符,那么直接++;
参考程序如下:
//功能:在第一个字符中删除第二个字符出现过的所有字符
//实例:第一个字符:We are students.第二个字符:aeiou. 结果:W r stdnts.
//思路:创建一个用数组实现的简单的哈希表,之后利用快慢指针来删除字符
#include <iostream>
//#include <stdio.h>
#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';
}
void main()
{
char first[1000],second[1000];
cout << "输入两个字符: ";
//cin.getline(first);
//cin.getline(second);
//getline(cin,first);
//getline(cin,second);
gets(first);
gets(second);
DeletingChar(first, second);
cout << first << endl;
}
注意:c++采用cin输入字符串时,不可以直接利用cin来输入,可以结合getline,或者gets,这里需要注意的是在c中还必须得加上头文件#inlcude<stdio.h>,但是C++中没有必要。
实验结果:
——To_捭阖_youth 23:19
相关文章推荐
- 哈希表对字符串的高效处理7:删除字符串中出现次数最少的字符
- 哈希表对字符串的高效处理7:删除字符串中出现次数最少的字符
- sql 语句 写一个函数T-sql函数elimination(a,b)将出现在第一个字符串中的第二个字符串中的所有字符删除,即:select dbo.elimination('abcdefg123
- 哈希表对字符串的高效处理4:删除字符串中重复出现的字符
- 哈希表对字符串的高效处理1:在一个字符串中找到第一个只出现一次字符
- 剑指Offer----面试题35:扩展----第一个字符串中删除第二个字符串中出现过的所有字符
- 在第一个字符串中删除在第二个字符串中出现的所有字符
- 在一个字符串中删除指定的字符 & 删除字符串中所有出现在另一个字符数组中的字符
- 定义一个字符串类DelSameStr,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个
- 【1-23】编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。再c语言中,注释不允许嵌套。
- 从第一个字符串中删除第二个字符串中出现的所有字符
- 练习1-23:编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言程序中,注释不允许嵌套
- 定义一个字符串类DelSameStr,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为”cocoon”,删除重复出现的字符后,其结果是字符串”con”
- 从第一个字符串中删除在第二个字符串中出现过的所有字符
- 剑指Offer:从第一个字符串中删除第二个字符串中出现过的所有字符
- 编写一个删除C语言程序中所有注释语句,正确处理带引号的字符串与字符常量
- 编写一个删除C语言源程序中的所有注释语句,要正确处理带引号的字符串和字符常量。
- C# 3.0 Cookbook:一、字符与字符串处理(3):在一个字符串内寻找另一个字符串出现的所有位置
- 剑指offer相关题目,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符
- 输入两个字符串,从第一个字符串中删除第二个字符串中出现过的所有字符