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++) {
