zoukankan      html  css  js  c++  java
  • 串的模式匹配

    在串的各种操作中。串的模式匹配是经经常使用到的一个算法。串的模式匹配也称为子串的定位操作,即查找子串在主串中出现的位置。

    1.经典的模式匹配算法Brute-Force。

    2.KMP算法。

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
      
    #define MAXSIZE 60  
      
    typedef struct  
    {  
        char ch[MAXSIZE];  
        int length;  
    }SeqString;
    
    
    #include "SeqString.h"  
    /*经典的模式匹配算法Brute-Force*/  
    /*假设串採用顺序存储方式存储。则Brute-Force匹配算法例如以下*/  
      
    int B_FIndex(SeqString S,int pos,SeqString T)  
    /*在主串S中的第pos个位置開始查找子串T,假设找到,返回子串在主串中的位置;否则返回-1*/  
    {  
        int i,j;  
        i = pos-1;  
        j = 0;  
        while(i < S.length && j < T.length)  
        {  
            if(S.ch[i] == T.ch[j])  
                /*假设串S和串T中相应的位置的字符相等,则继续比較下一个字符*/  
            {  
                i++;  
                j++;  
            }  
            else  
                /*假设当前相应位置的字符不相等,则从串S的下一个字符開始,从T的第0个字符開始比較*/  
            {  
                i = i-j+1;  
                j = 0;  
            }  
        }  
        if(j >= T.length)  
            /*假设在串S中找到串T,则返回子串T在主串S中的位置*/  
        {  
            return i-j+1;  
        }  
        else  
        {  
            return -1;  
        }  
    }  
    
    
    #include "SeqString.h"  
    /*KMP算法*/  
    /*KMP算法思想*/  
    /*利用模式串T的next函数值求T在主串S中的第pos个字符之间的位置的KMP算法描写叙述例如以下:*/  
      
    int KMP_Index(SeqString S,int pos,SeqString T,int next[])  
    {  
        int i,j;  
        i = pos-1;  
        j = 0;  
        while(i < S.length && j < T.length)  
        {  
            if(-1 == j || S.ch[i] == T.ch[j])  
                /*假设j=-1或当前字符相等,则继续比較后面的字符*/  
            {  
                i++;  
                j++;  
            }  
            else/*假设当前字符不相等,则将模式串向右移动*/  
            {  
                j = next[j];/*数组next保存next函数值*/  
            }  
        }  
        if(j >= T.length)/*匹配成功。则返回子串T在主串S中的位置。否则返回-1*/  
        {  
            return i-T.length+1;  
        }  
        else  
        {  
            return -1;  
        }  
    }  
    
    
    
    #include "SeqString.h"  
    /*KMP算法*/  
    /*求next函数值*/  
    /*算法描写叙述例如以下*/  
    void GetNext(SeqString T,int next[])  
    {  
        int j,k;  
        j = 0;  
        k = -1;  
        next[0] = -1;  
        while(j < T.length)  
        {  
            if(-1 == k || T.ch[j] == T.ch[k])  
            {  
                j++;  
                k++;  
                next[j] = k;  
            }  
            else  
            {  
                k = next[k];  
            }  
        }  
    }  
    
    
    
    #include "SeqString.h"  
    /*KMP算法*/  
    /*求next函数值*/  
    /*改进算法例如以下*/  
    void GetNextVal(SeqString T,int nextval[])  
    {  
        int j,k;  
        j = 0;  
        k = -1;  
        nextval[0] = -1;  
        while(j < T.length)  
        {  
            if(-1 == k || T.ch[j] == T.ch[k])  
            {  
                j++;  
                k++;  
                if(T.ch[j] != T.ch[k])  
                {  
                    nextval[j] = k;  
                }  
                else  
                {  
                    nextval[j] = nextval[k];  
                }  
            }  
            else  
            {  
                k = nextval[k];  
            }  
        }  
    }  


  • 相关阅读:
    (笔试题)机器人的运动范围
    (排序)快速排序QuickSort
    (笔试题)风口的猪-中国牛市
    (笔试题)小米Git
    同一片蓝天下,有些人以你想象不到的方式活着
    为什么那么多人工作都不开心?
    比你优秀的人都在努力
    海马体记忆训练:让你拥有超常记忆力
    致青春:不虚度,是对青春最好的交代
    你的袜子还是干的吗?
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7096326.html
Copyright © 2011-2022 走看看