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; }