算法习题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
输入两个字符串,
从第一字符串中删除第二个字符串中所有的字符。
例如,
输入”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
相关文章推荐
- 63 在字符串中删除特定的字符
- 算法题40 在字符串中删除特定的字符。
- 算法题4 在字符串中删除特定的字符
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 数据结构——算法之(022)( 在字符串中删除特定的字符)
- 每天一道算法题(7)——在字符串中删除特定的字符
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 每天一道算法题(7)——在字符串中删除特定的字符
- 【算法20】在字符串中删除特定的字符
- 微软100题(63)在字符串中删除特定的字符
- 【字符串处理算法】删除特定的字符的算法设计及C代码实现
- 【算法20】在字符串中删除特定的字符
- 面试题-在字符串中删除特定的字符[算法]
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- [算法学习]在字符串中删除特定的字符
- 每天一道算法题12 在字符串中删除特定的字符
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 在字符串中删除特定的字符
- 删除字符串中的特定字符