21天学习挑战赛KMP模式匹配算法

Posted Alex抱着爆米花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21天学习挑战赛KMP模式匹配算法相关的知识,希望对你有一定的参考价值。


活动地址:CSDN21天学习挑战赛

怕什么真理无穷,进一步有一份的欢喜。

目录

【21天学习挑战赛】KMP模式匹配算法

✌我为什么参与挑战赛

1,机缘

读到研一了,暑假假期打开私信发现这个挑战赛就鼓起勇气参加了。

2,期待的收获

A, 本人在华南理工大学攻读专硕,目前研究方向是图像恢复,从事深度学习相关工作,目标是从事Java后端开发。
B, 期待您的反馈,如果有什么不对的地方,欢迎指正!
C, 期待认识志同道合的领域同行或技术交流。
如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

🍉模式匹配算法?

对于子串的定位操作通常成为串的模式匹配,可以看下图就是匹配的过程

💬KMP模式匹配算法的定义

可以看到上面的匹配是一位一位的挪动,匹配算法很低效,KMP算法是前人发表的一种模式匹配算法来大大避免重复遍历的情况。

✨KMP模式匹配算法的优劣

优势

大大减低时间复杂度,从原来的O((n-m+1)*m)降低为O(n+m)

劣势

原理较复杂,实现困难

🍵KMP模式匹配算法的步骤

  1. 构建next数组(请参考KMP学习资料)
  2. 进行匹配

✍️ 算法实现

package wpc.leetbook.arrString;

import org.junit.jupiter.api.Test;

import java.util.Arrays;

public class KMP 
    private int[] get_next(String T) 
        int m = T.length();
        int[] next = new int[m];
        next[0] = -1;
        int j = -1, i = 0;
        // j表示当前字符之前的串的前后缀的相似度
        while (i < m - 1) 
            // T[j] 表示前缀的单个字符
            // T[i] 表示后缀的单个字符
            if (j < 0 || T.charAt(j) == T.charAt(i)) 
                j++;
                i++;
                next[i] = j;
             else 
                //如果字符不同就进行回溯,退到合适位置,i不变
                j = next[j];
            
        
        return next;
    

    public int strStr(String haystack, String needle) 
        if (needle.length() == 0) return 0;
        int m = haystack.length(), i = 0;
        int n = needle.length(), j = 0;
        //获取next数组
        int[] next = get_next(needle);
        while (i < m && j < n) 
            //两个字母相等,继续匹配
            if (j < 0 || haystack.charAt(i) == needle.charAt(j)) 
                i++;
                j++;
             else 
                //j退到合适位置,i不变
                j = next[j];
            
        
        if (j == n) 
            return i - j;
         else return -1;

    

    @Test
    public void test() 
        int[] arr = get_next("abcabx");
        System.out.println(Arrays.toString(arr));
    


如果觉得对你有帮助的话:
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

以上是关于21天学习挑战赛KMP模式匹配算法的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——KMP字符串匹配算法

限时21天学习挑战赛 - 经典算法

限时21天学习挑战赛 - 经典算法

数据结构20:KMP算法(快速模式匹配算法)详解

21天学习挑战赛GoatGui邀你参加机器学习研讨班

KMP算法学习&总结