(面试题)删除在另一个字符串中出现的字符
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; }
相关文章推荐
- 做一个优雅的程序员
- (剑指Offer)面试题35:第一个只出现一次的字符
- 黑马程序员——练习题:向一维数组输入元素并全部输出
- 记阿里Java研发应届生电话面试
- 黑马程序员——自学总结(四)Java IO技术之流对象
- 黑马程序员——Java反射总结
- 黑马程序员---for循环和案例
- 黑马程序员---while 和do while 循环
- 一道小小的内存申请面试题
- 中兴软创Java实习生面试题目
- 2015年面试经历
- 阿里电话面试详解
- 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
- (剑指Offer)面试题34:丑数
- 阿里电话面试题详解
- 新人入职培训有关职场沟通的总结分享
- 《程序员面试宝典4学习记录》
- 黑马程序员——Java IO总结二
- 求一个整形数组的和最大的连续子串 -------- 程序员面试金典
- 黑马程序员