字符匹配 kmp算法

// KMPTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
void KMP(char *primary, char *pattern,int n1,int n2, int *position);
void BuildNext(char *pattern, int length, int *next);
int main()
{
    int * position = new int[40];//用于存放从peimary字符串中寻找出的 pattern 字符串的所在位置的下标 从1开始 position[0]中存放找到的所有位置的下标
    char pattern[100] = " abcabc";//匹配字符串
    char primary[100] = " abcabcabcabcdhfjdsk"; //主串
    /*
    cout << "please input the primary string !" << endl;
    cin >> primary;
    cout << "please input the patttern string !" << endl;
    cin >> pattern;
    */
    KMP(primary, pattern,19,6, position);
    for (int i = 1; i <= position[0]; i++)
    {
        cout << position[i] << endl;
    }
    system("pause");
    return 0;
}
void KMP(char *primary, char *pattern,int n1,int n2, int *position)
{
    int next[50];
    BuildNext(pattern,n2, next);//构造匹配字符串的next数组
    position[0] = 0;//清0 记录找到的子串的个数
    int i = 1;
    int j = 1;
    while (n1 - i  >= n2 - j &&i<=n1)
    {
        if (primary[i] == pattern[j])
        {
            i++;
            j++;
            if (j == n2+1)
            {
                position[0]++;
                position[position[0]] = i - n2;
                j = 1;
            }
        }
        else//当primary[i]!=pattern[j]时 移动parrern j的下标 
        {
            j = next[j];
            if (j == 0)
            {
                i++;
                j++;
            }
        }
    }

}
void BuildNext(char *pattern,int length, int *next)//构造pattern字符串的next数组
{
    int i, j;//i为next数组的下标 j为可能的next数组的值
    i = 1;//next数组下标从1到 length  next[i]=j 的意思是当第i个字符匹配不成功时 应该和第j个字符匹配
    j = 0;
    next[1] = 0;
    while (i <= length)
    {
        if (j == 0 || pattern[i ] == pattern[j ])//如果第i个和第j个元素相等 在比较i+1元素失败时可以比较 j+1元素 在j=0时即前面和后面没有一个元素匹配成功 则在比较i++元素失败时 则需和pattern中的第一个元素进行比较
        {
            j++;
            i++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hebastast

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值