package com.example.test_utils.algorithm;
public class FindIndex {
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
for (double i = 0; i < 10000; i++) {
str.append('a');
}
String s = str.append('c').toString();
StringBuilder tr = new StringBuilder();
for (double i = 0; i < 1000; i++) {
tr.append('a');
}
String t = tr.append('c').toString();
long startTime = System.currentTimeMillis();
int indexByViolence = violenceMatch(s, t);
long endTime = System.currentTimeMillis();
long costTime = endTime-startTime;
System.out.println("暴力算法执行时间"+costTime);
System.out.println("暴力算法查找位置为"+indexByViolence);
startTime = System.currentTimeMillis();
int indexByKMP = kmpMatch(s, t);
endTime = System.currentTimeMillis();
costTime = endTime-startTime;
System.out.println("KMP执行时间"+costTime);
System.out.println("KMP查找位置为"+indexByViolence);
if (indexByKMP == indexByViolence) {
System.out.println("两种方法位置一致");
}else {
System.out.println("两种方法位置不一致");
}
}
private static int violenceMatch(String s, String t) {
int i =0;
int j =0;
while (i < s.length() && j < t.length()) {
if (s.charAt(i) == t.charAt(j)) {
i++;
j++;
}else{
i = i - j + 1;
j = 0;
}
}
if (j == t.length()) {
return i-j;
}else {
return -1;
}
}
private static int kmpMatch(String s, String t) {
int[] next = new int[t.length()];
for (int i = 0; i < next.length; i++) {
next[i] = getNextValue(i + 1,t);
}
int i =0;
int j =0;
while (i < s.length() && j < t.length()) {
if (s.charAt(i) == t.charAt(j)) {
i++;
j++;
}else{
if (j == 0) {
i = i+1;
}
else{
j = next[j-1];
}
}
}
if (j == t.length()) {
return i-j;
}else {
return -1;
}
}
private static int getNextValue(int tSonLength,String t) {
if (tSonLength == 1) {
return 0;
}
String prefixT;
String suffixT;
int maxMatch = 0;
int matchNum = tSonLength-1;
int i = 1;
int j = tSonLength - 1;
while (matchNum > 0) {
prefixT = t.substring(0, i);
suffixT = t.substring(j, tSonLength);
if (prefixT.equals(suffixT)) {
maxMatch = i;
}
i++;
j--;
matchNum--;
}
return maxMatch;
}
}