zoukankan      html  css  js  c++  java
  • [算法] kmp实现

    字符串查找是经典场景,也是面试中最常见的一道题。

    说来惭愧,毕业3年了,才明白了kmp算法的实现,以前一直以为这类算法是基础,工作中中不会碰到【也的确没有碰到过。。。】

    但是,对这些基本算法结构的理解是做一个工程师最基本的技能,好好学习,天天向上,在年前项目停止打酱油的日子里,敲了个bf和kmp的实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int bf(char *s, char* p) {
        int i, j;
        int lens,lenp;
        if(NULL == s || NULL == p) {
            return -1;     
        }
        lens = strlen(s);
        lenp = strlen(p);
        for(i = 0; i < lens; i++) {
            j = 0;
            while(s[i] == p[j] && j < lenp) {
                i ++;
                j ++;     
            }      
            if(j == lenp) {
                return i - lenp;     
            }
            i = i - j + 1;
        }    
        return -1;
    }
    
    int main() {
        int ret;
        char s[] = "abcdhelloadf"; 
        char p[] = "hello";
        ret = bf(s, p);
        printf("%d", ret);
        return 0;
    }
    

      

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXN 100
    
    char s[MAXN] = "ababaababcaba";
    char p[MAXN] = "ababc";
    int next[MAXN];
    
    int kmp(char *s, char *p) {
        int i, j;    
        int lens, lenp;
        if( NULL == s || NULL == p) {
            return -1; 
        }
        lens = strlen(s);
        lenp = strlen(p);
        for(i = 0; i < lens; i++) {
            j = 0;
            while(s[i] == p[j] && j < lenp) {
                i ++;
                j ++;     
            }      
            if( j == lenp) {
                return i - j;      
            }
            if(next[j] != -1){
                j = next[j];     
            }
            else {
                j = 0;
                i ++;     
            }
        } 
        return -1;
    }
    
    void get_next(char *p, int *next) {
        int i, j;
        int len;
        int tmp;
        len = strlen(p);
        for(i = 0; i < len; i++) {
            if(i == 0) {
                next[i] = -1;     
            }
            else if(i == 1) {
                next[i] = 0;     
            }
            else {
                tmp = i - 1;         
                for(j = tmp; j >= 0; j--) {
                    if(equal(p, i, j)) {
                        next[i] = j;
                        break;
                    }     
                }
            }
        }
    }
    
    int equal(char *p, int i, int j) {
        int tmpi;
        for(tmpi = 0; tmpi < j; tmpi++) {
            if(p[tmpi] != p[i, i - j + tmpi]) {
                return 0;     
            }       
        }
        return 1;
    }
    
    int main() {
        int lenp; 
        int ret;
        get_next(p, next); 
        ret = kmp(s, p);
        printf("%d
    ", ret);
        
        return 0;
    }
    

      

  • 相关阅读:
    【读书笔记】iOS-照相机与摄像头
    【读书笔记】iOS-加速计与陀螺仪
    【读书笔记】iOS-手势识别
    【读书笔记】iOS-移动开发
    【读书笔记】iOS-配件
    iOS开发UI篇—核心动画(转场动画和组动画)
    iOS开发UI篇—核心动画(关键帧动画)
    iOS开发UI篇—核心动画(基础动画)
    iOS开发UI篇—核心动画简介
    iOS开发UI篇—CAlayer(自定义layer)
  • 原文地址:https://www.cnblogs.com/igloo1986/p/3534309.html
Copyright © 2011-2022 走看看