您的位置:首页 > 其它

算法习题63:字符串删除特定字符

2013-11-14 11:52 344 查看
题目:字符串删除特定字符

输入两个字符串,

从第一字符串中删除第二个字符串中所有的字符。

例如,

输入”They

are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

---------------------------------------------

对于这中类型的题目,如果要一个个循环,那么O(m*n)。。

可不可以提高速度呢?我们这里最大的障碍就是查找问题,所以只要我们能够提高查找速度,那速度就上去了,哈希算法的查找最快了O(1),所以我们可以用哈希表为第二个字符串建立一个索引。

简单,直接char[256],这个可以快速解决问题。不过空间上还是可以再次优化,我们这里只需要01即出现与否,而每个字节可以表示0-255,2-255是浪费了,所以用位图形式

我们只需要char[32] 32个字节表示来256位,(如果用Bloom Filter,数据较小这里容易引起冲突,不然一个字节就够了。。)

复杂就是为运算稍微转换下就好了

这里删除也是一个注意点:

最好的方法就是边找边删,利用一个先前哨兵去找,找到非删除点给主哨兵,这样在时间上也省下了从O(n*n)--->O(n)

我这里先标记,再删除(最后放在一起,我这里还是不够完备,如果某个字符是255我就bug了)

纯练手,大家把我marked和delete整合下就好

//============================================================================
// Name : DeleteExist.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 50
typedef unsigned char UINT8;

void DeleteExist(UINT8 *str1, UINT8 *str2);
void InitHashTable(char* hashTable, UINT8* str2);

/*
* 带符号的移位
*/
int main() {
UINT8 str1[MAX];
UINT8 str2[MAX];
gets((char*)str1);
gets((char*)str2);
DeleteExist(str1,str2);
cout<<str1;
return 0;
}

void DeleteExist(UINT8 *str1, UINT8 *str2){
char* hashTable = new char[32];
InitHashTable(hashTable, str2);

UINT8* p1 = str1;
UINT8* p2 = str1;
//1:marked
UINT8 key1,key2;
while(*p1 != '\0'){
key1 = (*p1)>>3;
key2 = (*p1)-(key1<<3);
if((hashTable[key1] & (0x80>>key2)) != 0)
*p1 = 255;
p1++;
}

//2:delete
p1=str1;
while(true){
while(*p2!='\0' && *p2==255)
p2++;
(*p1) = (*p2);
if(*p2=='\0')
break;
p1++;
p2++;
}
//
delete []hashTable;
}

void InitHashTable(char* hashTable, UINT8* str2){
int i = 0;
UINT8 key1,key2;
for(i=0;i<32;i++)
hashTable[i]=0;

while(*str2 != '\0'){
key1 = (*str2)>>3;
key2 = (*str2)-(key1<<3);
hashTable[key1] |= (0x80>>key2);
str2++;
}
}


hellohh
h
ello
hello I am a student
aeiou
hll I m  stdnt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息