Скажем, у меня есть строка "Torcellite" и еще одна строка "Tor" - длина подобия этих двух строк равна 3, так как оба они начинаются с "Tor". Теперь другая строка "christmas" и "mas" будет иметь сходство 0, так как они не начинаются с одного и того же набора символов.
В обоих случаях вторая строка является суффиксом первой строки.
Более ясный пример:
Длина строки: от 1 до 10 ^ 5
Строка: abaabc
Суффиксы: abaabc
, baabc
, aabc
, abc
, bc
, c
Сходство: abaabc
, none, a
, ab
, none, none
Сходство Длина: 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)
, а затем найти самое длинное групповое совпадение.
Есть ли более эффективный алгоритм, который может его достичь?