KMP和Manacher算法,如何应用于匹配?

摘要:package com.zuoshen.jichutisheng.class03; public class code01 { ** * 字符串匹配算法 * next[k]表示为从0到k-1中最长前缀和后缀的匹配长度 * @param s
package com.zuoshen.jichutisheng.class03; public class code01 { /** * 字符串匹配算法 * next[k]表示为从0到k-1中最长前缀和后缀的匹配长度 * @param s 文本串,父串 * @param m 模式串,子串 * @return 在父串中查找子串,存在返回父串中子串的起始下标,否则返回-1 */ public static int KMP(String s, String m) { if (s == null || m == null || m.length() < 1 || s.length() < m.length()) { return -1; } char[] chars1 = s.toCharArray(); char[] chars2 = m.toCharArray(); int i1 = 0; int i2 = 0; int[] next = getNextArray(chars2); while (i1 < chars1.length && i2 < chars2.length) { if (chars1[i1] == chars2[i2]) { i1++; i2++; } else if (next[i2] == -1) { // i2 == 0 i1++; } else { i2 = next[i2]; } } // 数组中下标是6,是第7个,加不加1取决于返回什么 return i2 == chars2.length ? i1 - i2 : -1; } /** * KMP的辅助数组 * @param chars * @return */ public static int[] getNextArray(char[] chars) { if (chars.length == 1) { return new int[] {-1}; } int[] next = new int[chars.length]; next[0] = -1; next[1] = 0; int i = 2; int cn = 0; while (i < next.length) { if (next[i - 1] == next[cn]) { next[i++] = ++cn; } else if (cn > 0) { cn = next[cn]; } else { next[i++] = 0; } } return next; } /** * 最长回文子串的长度 * @param string * @return */ public static int maxLcpsLength(String string) { if (string == null || string.length() == 0) { return 0; } char[] chars = string.toCharArray(); // charArr是辅助字符串,添加辅助字符 char[] charArr = new char[chars.length * 2 + 1]; int index = 0; for (int i = 0; i < charArr.length; i++) {
阅读全文