java - 算法 - kmp查找字符串第一次出现的位置
时间:2019-11-18
本文章向大家介绍java - 算法 - kmp查找字符串第一次出现的位置,主要包括java - 算法 - kmp查找字符串第一次出现的位置使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代码很简单,主要是思路可能会有点绕- -|||
reference:
https://www.bilibili.com/video/av54029771?p=162
package search; public class MatchString { public static void main(String[] args){ String str1 = "abc babd abcdabcd abcdabdcde"; String str2 = "abcdabd"; //寻找str2 在str1中第一次出现的位置 System.out.println(kmp(str1, str2)); System.out.println(str1.charAt(kmp(str1,str2))); } public static int kmp(String str1, String str2){ int[] mt = matchTable(str2); char[] cArr1 = str1.toCharArray(); char[] cArr2 = str2.toCharArray(); for(int i = 0, j = 0; i < str1.length(); i++ ){ if(cArr1[i] == cArr2[j]){ j++; } else{ j = mt[j]; } if(j == str2.length()){ //因为最后一个匹配成功后,j++了,所以这里是j = length() return i - str2.length() + 1; //i此时指向了匹配成功的字符串的最后一个字符,所以要向前移动字符串长度 - 1 距离指向第一个字符,然后返回 } } return -1; } public static int[] matchTable(String str){ //建立匹配表 char[] cArr = str.toCharArray(); int[] mt = new int[str.length()]; mt[0] = 0; for(int i = 1, j = 0; i < cArr.length; i++){ mt[i] = 0; if(cArr[i] == cArr[j]){ j++; } else{ j = 0; } mt[i] = j; } for(int i = 0; i < mt.length; i++){ System.out.print(mt[i] + " "); } System.out.println(); return mt; } }
原文地址:https://www.cnblogs.com/clamp7724/p/11881486.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- PHP内置函数生成随机数实例
- PHPStudy下如何为Apache安装SSL证书的方法步骤
- PHP的mysqli_thread_id()函数讲解
- thinkPHP框架中layer.js的封装与使用方法示例
- OpenCV+python实现实时目标检测功能
- 在tensorflow实现直接读取网络的参数(weight and bias)的值
- python tkiner实现 一个小小的图片翻页功能的示例代码
- 在Pytorch中使用Mask R-CNN进行实例分割操作
- PHP类的自动加载机制实现方法分析
- strpos() 函数判断字符串中是否包含某字符串的方法
- Laravel框架基于ajax和layer.js实现无刷新删除功能示例
- 详解php伪造Referer请求反盗链资源
- Laravel框架基于ajax实现二级联动功能示例
- django haystack实现全文检索的示例代码
- 基于Python下载网络图片方法汇总代码实例