您的位置:首页 > 职场人生

(面试题)删除在另一个字符串中出现的字符

2015-07-25 21:13 447 查看

题目:

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

思路:

通过hash表记录第二个字符串中出现的字符,hash表可以由长度为256的bool数组表示。

然后遍历第一个字符串,每扫描一个字符,通过检查hash表判断该字符是否在第二个字符串出现过,如果是,则删除,否则继续。

那么如果在字符串中删除字符呢?一般而言,每删除一个字符,后面的字符必须往前移,如果每个字符都需要这么操作的话,复杂度就很高了。

解决办法:通过两个指针,一个用于遍历字符串pFast,一个用于删除字符pSlow,当pFast指针所指字符没有在第二个字符串出现过,则*pSlow=*pFast,pSlow++,即保留该位置的字符,否则,pSlow不变,当遍历完字符串之后,*pSlow='\0',以表示删除字符后的新字符串。

代码:

#include <iostream>

using namespace std;

void deleteChars(char* str1,char* str2){
if(str1==NULL || str2==NULL)
return;
const int tableSize=256;
bool hashTable[tableSize];
for(int i=0;i<tableSize;i++)
hashTable[i]=false;
//memset(hashTable,0,sizeof(tableSize));

int index;
while(*str2!='\0'){
if(*str2>=0)
index=*str2;
else
index=*str2+256;
hashTable[index]=true;
str2++;
}

char* pSlow=str1;
char* pFast=str1;
while(*pFast!='\0'){
if(*pFast>=0)
index=*pFast;
else
index=*pFast+256;
if(!hashTable[index]){
*pSlow=*pFast;
pSlow++;
}
pFast++;
}
*pSlow='\0';
}

int main()
{
char str1[] = "They are students";
char str2[] = "Tt";
deleteChars(str1,str2);
cout<<str1<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: