KMP算法字符串匹配

简介:

对于暴力搜索法,当搜索词对应的字符与字符串中的字符不匹配时。将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。

应用KMP算法之后,则有:
= 
KMP算法
“部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。

KMP算法实现代码如下

void prefixFun(char *pattern, int *preFun)
{
    int len = 0; //length of pattern
    while ('\0' != pattern[len])
        len++;

    int LOLP = 0; //length of longest prefix
    preFun[1] = 0;
    for (int NOCM = 2; NOCM <= len; NOCM++) //NOCM : number of characters matched
    {
        while (LOLP > 0 && pattern[LOLP] != pattern[NOCM-1])
            LOLP = preFun[LOLP];
        if (pattern[LOLP] == pattern[NOCM-1])
            LOLP++;
        preFun[NOCM] = LOLP;
    }
}

void KMPstrMatching(char *target, char *pattern)
{
    int tarLen = 0;
    int patLen = 0;
    while ('\0' != target[tarLen])
        tarLen++;
    while ('\0' != pattern[patLen])
        patLen++;

    int *preFun = new int[patLen+1];
    prefixFun(pattern, preFun);

    int NOCM = 0; // number of characters matched

    for (int i = 0; i < tarLen; i++)
    {
        while (NOCM > 0 && pattern[NOCM] != target[i])
            NOCM = preFun[NOCM];
        if (pattern[NOCM] == target[i])
            NOCM++;

        if (NOCM == patLen)
        {
            cout<<"Pattern occurs with shift "<<i - patLen + 1<<endl;
            NOCM = preFun[NOCM];
        }
    }

    delete [] preFun;
}


转自:http://blog.csdn.net/foreverling/article/details/44730669

目录
相关文章
|
5月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
3月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
112 1
两个字符串匹配出最长公共子序列算法
|
3月前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
29 0
|
3月前
|
算法
KMP算法
KMP算法
49 0
|
5月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
5月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
5月前
|
算法
KMP算法
KMP算法
40 0
|
5月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
101 0
|
1天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
14天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
149 80

热门文章

最新文章