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); }
分类:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义