题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”
和”aeiou”, 则删除之后的第一个字符串变成”Thy r stdnts.”。
我写的代码,已通过测试,复杂度高。
#include<iostream> using namespace std; char *deletestr(char *str1,char *str2) { char *str=new char[strlen(str1)]; int i=0; while(*str1!='\0') { char *matchstr=str2;int flag=0; while(*matchstr!='\0') { if(*str1==*matchstr) {flag=1;break;} else matchstr++; } if(flag==0) { str[i++]=*str1++; } else str1++; } str[i]='\0'; return str; } int main() { char str1[20],str2[20]; while(gets(str1)) { gets(str2); cout<<deletestr(str1,str2)<<endl; } return 0; }
别人写的经典代码
#include <stdio.h> #include <memory.h> int delchar(char *src, char *dst); int main() { char src[] = "They are students."; char del[] = "aeiou"; delchar(src, del); printf("Output : %s\n",src); return 0; } int delchar(char *src, char *dst) { char *begin = src; char *end = src; char hashtable[256]; int i = 0; memset(hashtable,0,sizeof(hashtable)); while(*dst) ++hashtable[*dst++]; while(*end) { if(!hashtable[*end])//del character not detected { *begin = *end ; ++begin; } ++end; } *begin= '\0'; }
此段代码有两点注意
1.用到了hash的思想来映射字符串。
2.两个临时指针恰到好处,边遍历边覆盖(即删除操作)