码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2019-04-03 12:47:12      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:哈哈   oid   rar   div   char   解决   代码   tps   []   

什么是KMP?

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。

 

 1 public class KMP {
 2 
 3     public static int KMP(String str1, String str2) {
 4         int len1 = str1.length(); // str1的长度 主串
 5         int len2 = str2.length();// str2的长度 模式串
 6         char[] arr1 = str1.toCharArray(); // 字符串转成字符数组
 7         char[] arr2 = str2.toCharArray();
 8         int[] next = new int[len2]; // next 存放 str[i]!= sre2[j]时 j的下个位置
 9         next = next(arr2);
10         int i = 0; // 主串指针
11         int j = 0;// 模式串指针
12         while (j < len2 && i < len1) {
13 
14             if (j == -1 || arr1[i] == arr2[j]) {
15                 i++;
16                 j++;
17             } else {
18                 j = next[j];
19             }
20         }
21 
22         if (j == len2) {// 主串含有模式串返回主串中模式串第一个字符的位置
23             return i - j;
24         } else {// 不含有返回-1
25             return -1;
26         }
27     }
28 
29     public static int[] next(char[] arr) { // 当主串str1[i]!= 模式串 str2[j] 时 j
30                                             // 应指向的位置 next[j]
31         int len = arr.length;
32         int next[] = new int[len];
33         next[0] = -1;
34         int k = -1;
35         int j = 0;
36         while (j < len - 1) {
37             if (k == -1 || arr[j] == arr[k]) {
38                 next[++j] = ++k;
39             } else {
40                 k = next[k];
41             }
42         }
43         return next;
44     }
45 
46     public static void main(String[] args) {
47         String str1 = "jiaorenzhan";
48         String str2 = "ren";
49         int index = KMP(str1, str2);
50         System.out.println(index);
51     }
52 }

看了一位程序员的博客(https://www.cnblogs.com/yjiyjige/p/3263858.html)感觉他的求next[]数组的代码很精简,顺手自己写了一遍 哈哈。

KMP算法

标签:哈哈   oid   rar   div   char   解决   代码   tps   []   

原文地址:https://www.cnblogs.com/jiaorenzhan/p/10647962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!