悉野小楼

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

kmp算法

具体参考https://www.cnblogs.com/ciyeer/p/9035072.html

理论参考:https://oiwiki.org/string/kmp/

下面的makeNext其实是制作前缀函数

前缀函数是字符串所有子字符串的真前缀=真后缀的最大值.

 

复制代码
/**
     * 创建next数组(数组第0位没作用, 从第1位才是有效位)
     * @param pattern
     * @return
     */
    static int[] makeNext(String pattern)
    {
        char[] chars = pattern.toCharArray();
        int[] next = new int[chars.length + 1];
        int i = 1;
        next[1] = 0;
        int j = 0;
        while (i < chars.length)
        {
            if (j == 0 || chars[i-1] == chars[j-1])
            {
                i++;
                j++;
                next[i] = j;
            }
            else
            {
                j = next[j];
            }
        }
        return next;
    }

    /**
     * kmp方法查询字符串(快速模式匹配算法)
     * 源字符串中的索引i不会回溯, 比对字符串时
     * 找到不一样的, 移动模式串的索引j来与源串中i位置再继续比较
     * @param src
     * @param pattern
     * @return
     */
    public static int kmpFindStr(String src, String pattern) {
        int[] next = makeNext(pattern);
        char[] s = src.toCharArray();
        char[] t = pattern.toCharArray();
        //j为模串的索
        int j = 0;
        //i为源字符串的索引
        for(int i = 0; i < s.length;) {
            if(j == 0 || t[j] == s[i]) {
                i++;
                j++;
                if(j >= t.length) {
                    //找到了
                    return i - j;
                }
            }
            else {
                //两个值不一样, 修改j的跳转位置
                j = next[j];
            }
        }
        return -1;
    }

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {
        int index = kmpFindStr("abf55abaabaca11", "abaabaca");
        System.out.print(index);
    }
复制代码

 

posted on   悉野  阅读(179)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示