package KMP;
import java.util.ArrayList;
import java.util.List;
public class KMPTest {
public static int[] calculateMaxMatchLengths(String pattern) {
int[] maxMatchLengths = new int[pattern.length()];
int maxLength = 0;
for (int i = 1; i < pattern.length(); i++) {
while (maxLength > 0 && pattern.charAt(maxLength) != pattern.charAt(i)) {
maxLength = maxMatchLengths[maxLength - 1];
}
if (pattern.charAt(i) == pattern.charAt(maxLength)) {
maxLength++;
}
maxMatchLengths[i] = maxLength;
}
return maxMatchLengths;
}
public static List<Integer> search(String text, String pattern) {
List<Integer> positions = new ArrayList<>();
int[] maxMatchLengths = calculateMaxMatchLengths(pattern);
int count = 0;
for (int i = 0; i < text.length(); i++) {
while (count > 0 && pattern.charAt(count) != text.charAt(i)) {
count = maxMatchLengths[count - 1];
}
if (pattern.charAt(count) == text.charAt(i)) {
count++;
}
if (count == pattern.length()) {
positions.add(i - pattern.length() + 1);
count = maxMatchLengths[count - 1];
}
}
return positions;
}
public static void main(String[] args) {
String text = "某某科技大学计算机学院软件工程";
String patter = "计算机学院";
List<Integer> list = search(text,patter);
System.out.println(list);
}
}
public class KMP {
public static void main(String[] args) {
String target = "abcdefg";
String pattern = "cdefgh";
boolean b = kmp(target, pattern);
System.out.println(b);
}
private static boolean kmp(String target, String pattern) {
int[] partialMathTable = createPartialMatchTable(pattern);
char[] targetCharArr = target.toCharArray();
char[] patternCharArr = pattern.toCharArray();
int matchCharCounts = 0;
int i = 0, j = 0, moveCounts = 0;
while (i < targetCharArr.length) {
if (targetCharArr[i] == patternCharArr[j]) {
matchCharCounts++;
i++;
j++;
}
else if (j == 0){
i++;
}
else{
moveCounts = matchCharCounts - partialMathTable[j -1];
j = j-moveCounts;
matchCharCounts = matchCharCounts - moveCounts;
}
if (j == patternCharArr.length){
return true;
}
}
return false;
}
private static int[] createPartialMatchTable(String pattern) {
int patternLen = pattern.length();
int[] matchTable = new int[patternLen];
for (int i = 0, matchValue = 0; i < patternLen; i++) {
if (i == 0) {
matchValue = 0;
} else {
matchValue = calcMatchValue(pattern.substring(0, i + 1));
}
matchTable[i] = matchValue;
}
return matchTable;
}
private static int calcMatchValue(String substr) {
int length = substr.length();
String preFixStr = substr.substring(0, length - 1);
String suffixStr = substr.substring(1);
while (preFixStr.length() > 0 && suffixStr.length() > 0) {
if (preFixStr.equals(suffixStr)) {
return preFixStr.length();
}
if (preFixStr.length() == 1 && suffixStr.length() == 1) {
break;
}
preFixStr = preFixStr.substring(0, preFixStr.length() - 1);
suffixStr = suffixStr.substring(1, suffixStr.length());
}
return 0;
}
}