KMP字符串查找算法

#include <iostream>
#include <windows.h>
using namespace std;

void get_next(char *str,int *num)
{
    int idFront = 0;
    int len = strlen(str);
    int amount = 1;
    int flag = 0;//相等时一直往下循环
    int flag2 = 0;//标记是否在循环过程中不匹配,如果在循环过程中不匹配,则要防止跳过这个数

    for(int i = 2;i<len;i++)
    {
        do
        {
            if(str[i-1] == str[idFront])
            {
                flag2 = 1;
                num[i] = ++amount;
                flag = 1;//保证相等就会循环一直循环到不等
                i++;
                idFront++;
            }
            else
            {
                if(flag2 == 1)//保证在相等循环时最后一个不匹配,然后再与第0个进行比较,避免外层for循环跳过这个不匹配的数
                {
                    i--;
                }
                flag2 = 0;
                flag = 0;
                idFront = 0;
                amount = 1;
            }
        }while(flag == 1);
    }
}

void find(char *str,char *substr)
{
    int *next = new int[strlen(substr)];
    for(int p=0;p<strlen(substr);p++)
    {
        next[p] = 1;
    }
    next[0] = 0;

    get_next(substr,next);

    int i=0;//i不会回溯
    int j=0;
    int count = 1;
    while(i<strlen(str) && j < strlen(substr))
    {
        cout << "第" << count++ << "次比较,i = " << i << "   j = " << j ;

        if(str[i] == substr[j])
        {
            cout << "      相等  " << endl;
            system("pause");
            i++;
            j++;
        }
        else
        {
            cout << "      不相等  " << endl;
            system("pause");
            if(j>0)
            {
                j = next[j] - 1;//下一次i与j比较的位置,可以在纸上画出来然后找出关系
            }
            else
            {
                j = 0;
                i++;
            }
        }
    }

    int len = strlen(substr);
    if(j == len)
    {
        cout << "找到,位置为" << i-strlen(substr) << endl;
    }
    else
    {
        cout << "没找到" << endl;
    }
}

void main()
{
    char *str = "abcdabcdabcdabceabcdabcabcdadewerwq";
    char *substr = "abcdabce";
    cout << str << endl;
    cout << substr << endl;
    find(str,substr);
}
时间: 2024-10-23 02:51:34

KMP字符串查找算法的相关文章

字符串查找算法-KMP

/** *    KMP algorithm is a famous way to find a substring from a text. To understand its' capacity, we should acquaint onself with the normal algorithm. */ /** *    simple algorithm * *    workflow: *        (say,  @ct means for currently position o

Rabin-Karp字符串查找算法

1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理.然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用.我们需要一些更快的方法来完成模式匹配的工作,然而在此之前,我们还是回过头来再看一遍暴力法匹配,以便更好地理解其他子串匹配算法. 如下图所示,在暴力字符串匹配里,我们将文本中的每一个字符和模式串的第一个字符进行比对.

Rabin-Karp指纹字符串查找算法

首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素. 基本思想 长度为M的字符串对应着一个R进制的M位数, 为了用一张大小为Q的散列表来保存这种类型的键, 需要一个能够将R进制的M位数转化为一个0到Q-1之间的int值散列函数, 这里可以用除留取余法. 举个例子, 需要在文本 3 1 4 1 5 9 2 6 5 3

字符串查找算法

#include<iostream> using namespace std; int BFMatch(char* s,char* p) { int i=0; int j=0; while(i<strlen(s)) { while(s[i]==p[j]&&j<strlen(p)) { j++; i++; } if(j==strlen(p)) return i-strlen(p); i=i-j+1; } return -1; } int main() { char*

字符串查找与匹配之BM算法

一.字符串查找:1.在Word. IntelliJ IDEA.Codeblocks等编辑器中都有字符串查找功能.2.字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串. 二.字符串匹配:1.一个字符串是一个定义在有限字母表上的字符序列.例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串.2.字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置.其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上.3.字符串匹配的应用包括信

字符串查找与匹配算法

一.字符串查找:1.在Word. IntelliJ IDEA.Codeblocks等编辑器中都有字符串查找功能.2.字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串. 二.字符串匹配:1.一个字符串是一个定义在有限字母表上的字符序列.例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串.2.字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置.其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上.3.字符串匹配的应用包括信

暴力子字符串查找

子字符串查找:给定一段长度为N的文本和一个长度为M的模式字符串,在文本中找到一个和该模式相符的子字符串 广泛使用的暴力算法,虽然在最坏情况下的运行时间与M*N成正比,但是在实际中,绝大多数比较在比较第一个字符时就会产生不匹配,它实际运行时间一般与M+N成正比 下面是暴力子字符串查找算法的Java实现: /** * 暴力字符串查找,如果找到,返回pat在txt中第一次出现的位置:没有找到则返回N的值 * @param txt * @param pat * @return */ public int

基本算法——字符串查找之KMP算法

虽然,c++标准库中为我们提供了字符串查找函数,但我们仍需了解一种较为快捷的字符串匹配查找——KMP算法. 在时间复杂度上,KMP算法是一种较为快捷的字符串匹配方法. 实现代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <stdexcept> 5 using namespace std; 6 7 void get(const string &

一步一步写算法(之字符串查找 上篇)

原文:一步一步写算法(之字符串查找 上篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 字符串运算是我们开发软件的基本功,其中比较常用的功能有字符串长度的求解.字符串的比较.字符串的拷贝.字符串的upper等等.另外一个经常使用但是却被我们忽视的功能就是字符串的查找.word里面有字符串查找.notepad里面有字符串查找.winxp里面也有系统自带的字符串的查找,所以编写属于自己的字符串查找一方面可以提高自己的自信心,另外一方面在某