package org.nutz.mvc.upload.util;
import org.nutz.lang.Lang;
/**
* 根据给给定的 bytes[] 计算所有的查找回溯点
*
* @author zozoh(zozohtnt@gmail.com)
*/
public class RemountBytes {
public static RemountBytes create(String str){
return create(Lang.toBytes(str.toCharArray()));
}
public static RemountBytes create(byte[] bs) {
// 初始化失效数组
int[] fails = new int[bs.length];
// 如果数组长度大于 0
if (bs.length > 1) {
// 如果字符为 ABABCDE
// 循环从第三个开始的字符
for (int i = 2; i < bs.length; i++) {
// 如果当前为 C
// red: 本字符之前的子串 ABAB
// int redL = 0;
// int redR = i - 1;
// blue: 本字符之前的子串不包括第一个字符的子串 BAB
int blueL = 1;
int blueR = i - 1;
// 循环,遇到 blue 结束,不相等的话,游标置零
int x = 0;
for (int j = blueL; j <= blueR; j++) {
byte red = bs[x];
byte blue = bs[j];
if (red == blue)
x++;
else
x = 0;
}
// 当 blue 全部耗尽,长度为失效数组的值
fails[i] = x;
}
}
RemountBytes re = new RemountBytes();
re.bytes = bs;
re.fails = fails;
return re;
}
public byte[] bytes;
public int[] fails;
}