当前位置: 首页 > news >正文

数据结构-KMP算法

先解决 前缀与后缀串的最长匹配长度信息(前缀或后缀都不能取整体)。如下
位置6的前缀最长串就是abcab(不能取全部,即不能为abcabc)
位置6的后缀最长串就是bcabc(不能取全部,即不能为abcabc)

在这里插入图片描述


public class Code_KMP {public static void main(String[] args) {String s1 = "abcdefgjhi32jkls.dfs";String s2 = "s.df";System.out.println(getIndexOf(s1,s2));System.out.println(getIndexOf2(s1,s2));}public static int getIndexOf(String s1, String s2){if(s1 == null || s2 == null || s1.length() < 1 || s1.length() < s2.length()){return -1;}char[] str1 = s1.toCharArray();char[] str2 = s2.toCharArray();int x = 0;int y = 0;int[] next = getNextArray(str2);while(x < str1.length && y<str2.length){if(str1[x] == str2[y]){x++;y++;}else if(next[y] == -1){x++;}else{y = next[y];}}return y == str2.length ? x - y : -1;}public static int[] getNextArray(char[] match){if(match.length == 1){return new int[]{-1};}int[] nextArray = new int[match.length];nextArray[0] = -1;nextArray[1] = 0;nextArray[2] = (match[0] == match[1] ? 1 : 0);for (int i = 3; i < match.length; i++) {int cn = nextArray[i-1];while(cn != -1 && match[cn] != match[i-1]){cn = nextArray[cn];}nextArray[i] = cn + 1;}return nextArray;}public static int getIndexOf2(String s1, String s2){if(s1 == null || s2 == null || s1.length() < 1 || s1.length() < s2.length()){return -1;}char[] str1 = s1.toCharArray();char[] str2 = s2.toCharArray();int x = 0;int y = 0;int[] next = getNextArray2(str2);while(x < str1.length && y<str2.length){if(str1[x] == str2[y]){x++;y++;}else if(next[y] == -1){x++;}else{y = next[y];}}return y == str2.length ? x - y : -1;}public static int[] getNextArray2(char[] match){if(match.length == 1){return new int[]{-1};}int[] nextArray = new int[match.length];nextArray[0] = -1;nextArray[1] = 0;int cn = 0;int i = 2;while(i <match.length){if(match[0] == match[i]){ // 匹配成功nextArray[i++] = ++cn;}else if(cn > 0){cn = nextArray[cn];}else{nextArray[i++] = 0;}}return nextArray;}
}

http://www.mrgr.cn/news/11471.html

相关文章:

  • 团队管理之敏捷开发
  • 新零售社交电商系统案例分析
  • 数学建模学习(126):基于Python的最优最劣法(BWM)在多标准决策中的应用
  • RIP路由信息协议
  • Linux磁盘管理
  • 区块链应用,密码学会议书籍推荐以及隐私保护知识整理
  • 主流的工厂仓库管理系统 ERP 有哪些值得推荐?
  • 鸿蒙项目目录
  • C++ 设计模式——单例模式
  • NLP -->定义、应用、与职业前景解析
  • ai变声:视频怎么变音?分享6个语音变声器,视频变声不再难!
  • 深度学习在图像识别中的应用与挑战
  • 灰色关联度数据代码及分析方法
  • 使用Node-RED实现和部署物联网入侵检测的机器学习管道
  • c++ 谷歌的招聘 题解
  • Java面试宝典-java基础01
  • 550MHz超高主频:揭秘ST公司M7单核性能王MCU(附全系列MCU报告一览表)
  • CDGA|企业数据治理:迈向成功的关键路径
  • 云计算环境下的等保测评要点分析
  • C#入门(13)if语句