标签:哈哈 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[]数组的代码很精简,顺手自己写了一遍 哈哈。
标签:哈哈 oid rar div char 解决 代码 tps []
原文地址:https://www.cnblogs.com/jiaorenzhan/p/10647962.html