遇到一个题目,两个字符串,一个长字符串,一个子串,在长字符串中删除,任何出现在短字符串的函数。 开始以为是模式匹配的题目,后来发现不是文章BM算法中搜索子串的功能,当时慌了神。现在想想,其实并不是很难。
如 长字符串:abcdefhijklmnbcd
子串: bk
结果: acdefhijlmncd
删除长字符串中所有的b和k。
字符共有有256个(BYTE是8个bit),只需要维护一个长度为256的数组exist,1表示该字符出现在子串中如exist[‘b’] = 1,0表示没有出现在子串中exist['c'] =0,那么.遍历一遍长字符串,就可以删除那些子串的字符。
如果长字符串的长度为N,字串的长度为M,算法复杂度为(M+N)。比较节省,暴力搜索需要M*N的算法复杂度。
自己还是不能活学活用,本来这个算法只是BM算法的一部分,竟然没想到。记之。
- root@libin:~/program/C/string# ./test
-
this is a long string ,abcdefg
-
gi
-
ths s a lon strn ,abcdef
- #include<stdio.h>
-
#include<stdlib.h>
-
#include<string.h>
-
-
-
-
int delchar(char* src,char* del,char* dest)
-
{
-
if(src == NULL ||del==NULL||dest == NULL)
-
return -1;
-
-
int dellen = strlen(del);
-
int existed[256] ;
-
int i;
-
int srclen = strlen(src);
- int j = 0;
-
-
for(i = 0;i<256;i++ )
-
{
-
existed[i] = 0;
-
}
-
-
for(i = 0;i<dellen;i++ )
-
{
-
existed[del[i]] = 1;
-
}
-
-
for(i = 0;i<srclen;i++ )
-
{
-
if(existed[src[i]])
-
continue;
-
dest[j++] = src[i];
-
}
-
return 0;
-
}
-
-
int test()
-
{
-
char longstr[] = "this is a long string ,abcdefg";
-
char shortstr[]= "gi";
-
-
int len = strlen(longstr);
-
char *resultstr = (char*)malloc(len);
-
if(resultstr == NULL)
-
{
-
fprintf(stderr,"malloc for result str failed\n");
-
return -1;
-
}
-
delchar(longstr,shortstr,resultstr);
-
printf("%s\n%s\n%s\n",longstr,shortstr,resultstr);
-
-
free(resultstr);
-
return 0;
-
}
-
int main()
-
{
-
test();
-
return 0;
-
}
阅读(5357) | 评论(2) | 转发(0) |