zoukankan      html  css  js  c++  java
  • 【算法Everyday】第三日 KMP算法

    题目

    你知道的。

    分析

    分析不来。

    代码

    void OutputArray(int* pArr, int iLen)
    {
        for (int i = 0; i < iLen; i++)
        {
            printf("%d	", pArr[i]);
        }
        printf("
    ");
    }
    
      
    void GetNextValue(char const* szPattern, int iLen, int* pNextArr)
    {
        int i = 0;  
        pNextArr[i] = -1;
        int j = -1;
        while (i < iLen - 1)
        {
            if (j == -1 || szPattern[i] == szPattern[j])   
            {
                ++i;
                ++j;
                if (szPattern[i] != szPattern[j]) 
                    pNextArr[i] = j;      
                else
                    pNextArr[i] = pNextArr[j];
            }
            else                                 
                j = pNextArr[j];
        }
    }
    
    int KMP(const char * szTarget, const char * szPattern)
    {
        int iSrcLen = strlen(szTarget);
        int iPatternLen = strlen(szPattern);
    
        int* pNextArr = new int[iPatternLen];
        GetNextValue(szPattern, iPatternLen, pNextArr);
        OutputArray(pNextArr, iPatternLen);
    
        int targetIndex = 0;
        int patternIndex = 0;
        while (targetIndex < iSrcLen && patternIndex < iPatternLen)
        {
            if (patternIndex == -1 || szTarget[targetIndex] == szPattern[patternIndex])
            {
                ++targetIndex;
                ++patternIndex;
            }
            else
            {
                patternIndex = pNextArr[patternIndex];   
            }
        }
    
        delete[] pNextArr;
    
        if (patternIndex >= iPatternLen)
            return targetIndex - iPatternLen;
        else
            return -1;
    }
    
    void GetNextValue2(char const* szPattern, int iLen, int* pNextArr)
    {
        int index = 0;
        pNextArr[0] = -1;         
        for (int i = 1; i < iLen; ++i) 
        {
            index = pNextArr[i - 1];
            while (index >= 0 && szPattern[index + 1] != szPattern[i])
            {
                index = pNextArr[index];
            }
            if (szPattern[index + 1] == szPattern[i])
            {
                pNextArr[i] = index + 1;
            }
            else
            {
                pNextArr[i] = -1;
            }
        }
    }
    
    int KMP2(const char* szTarget, const char* szPattern)
    {
        const int iSrcLen = strlen(szTarget);
        const int iPatternLen = strlen(szPattern);
    
        int* pNextArr = new int[iPatternLen];
    
        GetNextValue2(szPattern, iPatternLen, pNextArr);
        OutputArray(pNextArr, iPatternLen);
    
        int patternIndex = 0;
        int targetIndex = 0;
        while (patternIndex < iPatternLen && targetIndex < iSrcLen)
        {
            if (szTarget[targetIndex] == szPattern[patternIndex])
            {
                ++targetIndex;
                ++patternIndex;
            }
            else if (patternIndex == 0)
            {
                ++targetIndex;
            }
            else
            {
                patternIndex = pNextArr[patternIndex - 1] + 1;
            }
        }
    
    
        delete[] pNextArr;
    
        if (patternIndex == iPatternLen)
            return targetIndex - patternIndex;
        else
            return -1;
    }
  • 相关阅读:
    很实用的html meta标签实现页面跳转
    oracle 实例名和服务名以及数据库名区别
    Oracle 创建 DBLink 的方法
    Java (六):java中Math常用方法
    Java (四):String,StringBuilder,StringBuffer三者的区别
    ROS Learning-001 安装 ROS indigo
    Windows cmd 将命令(/指令)写到一个文件里,直接运行这个文件。提高工作效率
    Blender 基础 骨架-02 骨架的各种呈现方式
    Blender 基础 骨架 01
    Python 解决 :NameError: name 'reload' is not defined 问题
  • 原文地址:https://www.cnblogs.com/quark/p/3671358.html
Copyright © 2011-2022 走看看