部分匹配长度的正则表达式 - 字符串相似性
假设我有字符串“Torcellite”和另一个字符串“Tor” - 这两个字符串的相似性长度为3,因为它们都以“Tor”开头。现在,另一个字符串“christmas”和“mas”的相似性将为0,因为它们不以相同的字符集开头。
在这两种情况下,第二个字符串都是第一个字符串的后缀。
一个更清晰的例子:
字符串长度:1 到 10^5
字符串:abaabc
后缀:abaabc
baabc
aabc
abc
bc
c
相似性: 、 无、 、 、 无、 无abaabc
a
ab
相似性长度: 6, 0, 1, 2, 0, 0
答案: 6+0+1+2+0+0 = 9
我有一个低效的逻辑来使用正则表达式找到这些部分后缀匹配项。
算法:
- 查找给定字符串的所有子字符串。
-
从后缀的子字符串创建模式。
for(int i=1; i<substrings[i].length; i++) { Pattern p = Pattern.compile("^"+substrings[i].substring(0, i)); Matcher m = p.find(string); //the given string for which similarities need to be calculated if(m.find()) similaryLengths += i; }
这样做的复杂性大约变成了O(n^2),因为我需要遍历字符串的后缀,然后是模式的子字符串。
我已经想到在模式中使用分组来查找组,但我不确定正则表达式会是什么样子。我想到的第一个子字符串是:然后找到最长的组匹配。
((((((a)b)a)a)b)c)
有没有更有效的算法可以实现他的?