删除指定字符

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

 

posted @ 2012-10-27 23:57  代码改变未来  阅读(316)  评论(0编辑  收藏  举报