面试路之常用字符串匹配算法(2)

1)暴力法O(m+n)

2)KMP、Boyer_Mooer、Rabin_Rarp

 

暴力法

复制代码
int strStr(String haystack, String needle){
    if ( needle.empty() ) return 0;
    if ( haystack.size() < needle.size() ) return -1;

    int n = haystack.size();
    int m = needle.size();

    for( int i=0; i<n-m; i++) {
        if( haystack[i] != needle[0] ) {
            continue;
        }
    
        for( int j=1; j<m; j++ ) {
            if(haystack[i+j] != needle[j] )
                break;    
        }

        if( j == m) return i;
    } 

    return -1;
}
复制代码

 

KMP算法

复制代码
//前缀计算函数
void computer_prefix( const char *pattern, int next[] ) {

    int i, j=-1;
    const int m = strlen(pattern);
    
    next[0]= j;
    
    for( i=1; i<m; i++ ) {
        while( j>-1 && pattern[j+1] != pattern[i] )
            j = next[j];
        
        if ( pattern[j+1] == pattern[i] )
            j = j+1;

        next[i] = j;
    }
} 


int kmp_matcher( const char *text, const char *pattern ) {
    
    int i, j=-1;
    const int n = strlen(text);
    const int m = strlen(pattern);
    
    if(m == 0) return 0;
    if(n < m) return -1;

    int *next = (int *)malloc(sizeof(int) *m);//需要判定是否分配成功
    computer_prefix(pattern, next);
    
    for( i=0; i<=n-m; i++) {
        while( j>-1 && pattern[j+1] != text[i] )
            j = next[j];

        if( text[i] == pattern[j+1] ) j++;
        
        if( j== m-1) {
            free(next);
            return i-j;
        }
    }

    free(next);
    return -1;
    
}
复制代码
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值