一篇文章带你了解C++的KMP算法

本文详细介绍了如何使用C++实现KMP算法,包括前后缀数组Next的计算和子串在母串中的高效查找过程,通过实例帮助理解该经典字符串匹配算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要介绍了c++ 实现KMP算法的示例,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下,希望能给你带来帮助

KMP算法

KMP算法作用:字符串匹配

例如母串S = “aaagoogleaaa”;

子串T= “google”;

步骤1:先计算子串中的前后缀数组Next

google
next[0]next[1]next[2]next[3]next[4]next[5]
-100010

C++代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//步骤1:

void GetNext(string Tsub, vector<int>& Next)

{

    int j = 0, k = -1;

    Next[0] = k;

    while (j < Tsub.length() - 1)

    {

        if (k == -1 || Tsub[j] == Tsub[k])

        {

            Next[++j] = ++k;

        }

        else

        {

            k = Next[k];

        }

    }

}

步骤2:查找子串在母串中出现的位置。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

//步骤2:

int KMP(string S, string T, vector<int> Next)

{

    int i = 0, j = 0;

    int m = S.length();

    int n = T.length();

    while (i < m && j < n)

    {

        if (j == -1 || S[i] == T[j])

        {

            i++;

            j++;

        }

        else

        {

            j = Next[j];

        }

    }

    if (j == n)

    {

        return i - j;

    }

    else

    {

        return -1;

    }

}

结合上面两个步骤写出完整代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

#include <iostream>

#include <vector>

using namespace std;

//步骤1:

void GetNext(string Tsub, vector<int>& Next)

{

    int j = 0, k = -1;

    Next[0] = k;

    while (j < Tsub.length() - 1)

    {

        if (k == -1 || Tsub[j] == Tsub[k])

        {

            Next[++j] = ++k;

        }

        else

        {

            k = Next[k];

        }

    }

}

//步骤2:

int KMP(string S, string T, vector<int> Next)

{

    int i = 0, j = 0;

    int m = S.length();

    int n = T.length();

    while (i < m && j < n)

    {

        if (j == -1 || S[i] == T[j])

        {

            i++;

            j++;

        }

        else

        {

            j = Next[j];

        }

    }

    if (j == n)

    {

        return i - j;

    }

    else

    {

        return -1;

    }

}

int main()

{

    string S = "aaagoogleaaa";

    string T = "google";

    vector<int> Next(T.length());

    GetNext(T, Next);

    int retVal = KMP(S, T, Next);

    if (retVal == -1)

    {

        std::cout << "can't Index" << std::endl;

    }

    else

    {

        std::cout << "Index :" << retVal << std::endl;

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值