(面试题)删除在另一个字符串中出现的字符
题目:
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
思路:
通过hash表记录第二个字符串中出现的字符,hash表可以由长度为256的bool数组表示。
然后遍历第一个字符串,每扫描一个字符,通过检查hash表判断该字符是否在第二个字符串出现过,如果是,则删除,否则继续。
那么如果在字符串中删除字符呢?一般而言,每删除一个字符,后面的字符必须往前移,如果每个字符都需要这么操作的话,复杂度就很高了。
解决办法:通过两个指针,一个用于遍历字符串pFast,一个用于删除字符pSlow,当pFast指针所指字符没有在第二个字符串出现过,则*pSlow=*pFast,pSlow++,即保留该位置的字符,否则,pSlow不变,当遍历完字符串之后,*pSlow='\0',以表示删除字符后的新字符串。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步