题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”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.两个临时指针恰到好处,边遍历边覆盖(即删除操作)