我想从expList计算textToBeTested数组中单词的存在。
请注意,expList和textToBeTested数组都非常大。
我可以简单地遍历两个列表并使用“.matches”方法进行计数,但它在O(n ^ 2)中。
我可以使用更快的算法或实现吗?
String[] expList = {"i", "i'd", "i'll", "i'm", "i'm", "bet[a-zA-Z]*", "my[a-zA-Z]*"};
String[] textToBeTested = {"this", "is", "better", "than", "my", "method"};
e.g。在上面的textToBeTested数组中,“better”和“my”与expList数组中的字符串匹配,因此它将返回2.
非常感谢您的帮助。
答案 0 :(得分:4)
如何将所有模式编译成使用交替的更大模式?如果正确编译成状态机,则替换可以快速(如Aho Corasick或KMP)。
boolean first = true;
StringBuilder sb = new StringBuilder();
for (String s : expList) {
sp.append("(?:").append(Pattern.quote(s)).append(')');
if (!first) {
sb.append('|');
}
first = false;
}
Pattern pattern = Pattern.compile(sb.toString());
// Possibly make this a ForkJoinTask
int count = 0;
for (String s : textToBeTested) {
if (pattern.matcher(s).matches()) {
count++;
}
}