(1)AC.java 实现了不支持包含词的AC自动机
(2)ACPlus.java实现了支持包含词的AC自动机
设输入长度为n,库中词数为m,则匹配的时间复杂度为O(n),与库中词数无关。
基本使用
// 如果您的词库中没有包含词,使用AC类实例化,而不是ACPlus
AC acPlus = new ACPlus();
acPlus.addWords(Arrays.asList("ABCEAFBABCD", "EA", "FB", "F", "B"));
acPlus.update();
System.out.println(acPlus.indexOf("ABCEAFBABCQEA"));
输出
[MatchResult{word='B', index=1}, MatchResult{word='EA', index=3}, MatchResult{word='F', index=5}, MatchResult{word='FB', index=5}, MatchResult{word='B', index=6}, MatchResult{word='B', index=8}, MatchResult{word='EA', index=11}]
保存
// 如果您使用AC类实例化,则使用AC.save
ACPlus.save(
acPlus, // 保存的AC自动机
new File("./test-ac"), // 保存文件
false // 是否启用多线程
);
加载
// 如果您使用AC类实例化,则使用AC.load
AC ac2 = ACPlus.load(
new File("./test-ac"), // 保存文件
false // 是否启用多线程
);