[题目]:用 C/C++语言编写一个高效率的函数来删除字符串里给定的字符集。这个函数的调用模型如下:
viod removechars (char str[], char remove[])
注意,remove中的所有字符都必须从str中删除干净。例如,如果str是"Battle of the Vowels: Hawaii vs. Grozny",remove是"aeiou",这个函数将把str转换成"Bttl f th Vwls: Hw vs. Grzny"。
我们需要快速到判断某些字符是否在一个字符串中出现,可以用字符来搜索那个数据结构。这意味着我们需要使用字符作为数组的下标(C语言允许把字符映射为整数去充当数组的下标)或者作为hash表的关键字。hash表和数组的元素查找时间都是一个固定值,hash表的查询开销略大于数组,但是使用数组我们必须首先进行初始化为0,它们之间的最大的区别也许是在内存的使用量方面了。采用数组的方案需要为remove中每一种字符准备一个元素以存放该字符是否在str中被删除而做的标记。如果我们处理的是ASCII字符串,则数组的元素个数将上一256个;而在hash表中,输入的字符串有多少种字符,hash表中元素的个数就将是多少。如果str和remove都比较长,但涉及的字符集却不太大(例如两者都是ASCII字符串)时,数组将是最好的选择;如果str和remove都比较短,但涉及的字符集却很大大(例如两者都是Unicode字符串)时,hash表将是最佳的选择。
该函数可以划分为3个部分:首先把速查表数组的全体元素设置为“0”。然后遍历remove中的每一个字符,把它们在速查表数组里对应的元素设置为“1”。最后,用两个指针来遍历str字符串,对速查表数组里对应为“0”的字符进行拷贝就能得到最终的结果。
void removechars(char str[], char remove[])
{
int src,dst,removearray[256];
for(src=0;src<256;src++)
{
removearray[src] = 0;
}
src=0;
while(remove[src])
{
removearray[remove[src]]=1;
src++;
}
src=dst=0;
do {
if(!removearray[str[src]])
str[dst++]=str[src];
}while(str[src++]);
}
C++实现:
/*Removechars.cpp Amirural设计*/
#include <iostream.h>
void removechars(char str[] , char remove[]);
void main()
{
char str[50],remove[10];
cout<<"请输入主字符串: ";
cin.getline(str,50);
cout<<"请输入要删除的字符集合: ";
cin>>remove;
cout<<"输出删除特定字符集后的str: ";
removechars(str,remove);
cout<<str<<endl;
}
void removechars(char str[], char remove[])
{
int src,dst,removearray[256];
for(src=0;src<256;src++)
{
removearray[src] = 0;
}
src=0;
while(remove[src])
{
removearray[remove[src]]=1;
src++;
}
src=dst=0;
do {
if(!removearray[str[src]])
str[dst++]=str[src];
}while(str[src++]);
}
运行结果:
请输入主字符串: Battle of the Vowels: Hawaii vs. Grozny
请输入要删除的字符集合: aeiou
输出删除特定字符集后的str: Bttl f th Vwls: Hw vs. Grzny