Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1871649
  • 博文数量: 283
  • 博客积分: 10141
  • 博客等级: 上将
  • 技术积分: 2931
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-21 14:33
文章分类

全部博文(283)

文章存档

2013年(2)

2012年(2)

2011年(17)

2010年(36)

2009年(17)

2008年(18)

2007年(66)

2006年(105)

2005年(20)

分类:

2007-07-08 17:28:39

第六单专门讲了一些字符串匹配的算法。
算法6.1为最简单的依次比对的方法,简单易实现,然而,却有相当大的改进余地。
设text长度为text_length, 被查找的字符串长patt_length,在平凡算法中,最少要比较patt_length次,而最坏为O(patt_length * text_length)
 
注:下面的代码从命令行读入text和pattern,如果输入含有特殊字符,需要转义。
本章内其后的代码实现基本与此相同,只是更换了sm的算法,不再重复注释。
 
#include
#include
#include
char * text = NULL;
char * pattern = NULL;
void usage(char * prog)
{
        printf("Usage: %s text pattern\n", prog);
        exit(123);
}
void simple_sm(char * patt, char * text, int patt_length, int text_length)
{
        int i = 0, j;
        while(i < text_length - patt_length +1)
        {
                j = 0;
                while(j < patt_length && patt[j] == text[i+j])
                        j ++;
                if(j >= patt_length)
                {
                        printf("position %d\n", i);
                        printf("text: %s\n", text);
                        printf("patn: ");
                        for(j = 1; j <= i; j ++)
                                printf(" ");
                        printf("%s\n", pattern);
                        return;
                }
                else
                        i ++;
        }
        printf("Not match\n");
}
int main(int argc, char * argv[])
{
        if(argc != 3)
                usage(argv[0]);
        else
        {
                text = argv[1];
                pattern = argv[2];
        }
        printf("text: %s\n", text);
        printf("patn: %s\n", pattern);
        simple_sm(pattern, text, strlen(pattern), strlen(text));
        return 1;
}
阅读(2564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~