В этой статье блога мы рассмотрим различные методы выявления повторяющихся шаблонов подстрок в заданной строке. Мы рассмотрим различные подходы, приведем примеры кода на Java и обсудим их плюсы и минусы. К концу этой статьи вы получите полное представление о различных методах решения этой проблемы.
Метод 1: перебор
Описание:
Подход перебора включает в себя проверку всех возможных подстрок заданной строки и проверку, можно ли повторить какую-либо из них для формирования всей строки.
Пример кода:
class Solution {
public boolean repeatedSubstringPattern(String s) {
int n = s.length();
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
String substring = s.substring(0, i);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < n / i; j++) {
sb.append(substring);
}
if (sb.toString().equals(s)) {
return true;
}
}
}
return false;
}
}
Метод 2: Алгоритм KMP
Описание:
Алгоритм Кнута-Морриса-Пратта (KMP) — это эффективный алгоритм сопоставления с образцом, который также можно использовать для обнаружения повторяющихся шаблонов подстрок. Он позволяет избежать избыточных сравнений, используя префиксную функцию для определения самого длинного правильного префикса, который также является суффиксом анализируемой строки.
Пример кода:
class Solution {
public boolean repeatedSubstringPattern(String s) {
int n = s.length();
int[] prefix = new int[n];
int i = 0, j = 1;
while (j < n) {
if (s.charAt(i) == s.charAt(j)) {
prefix[j] = i + 1;
i++;
j++;
} else {
if (i != 0) {
i = prefix[i - 1];
} else {
prefix[j] = 0;
j++;
}
}
}
int patternLength = n - prefix[n - 1];
return (patternLength != n && n % patternLength == 0);
}
}
Метод 3: скользящий хэш
Описание:
Техника скользящего хеширования предполагает использование скользящей хэш-функции для вычисления хеш-значений подстрок. Он сравнивает хэш-значения различных подстрок для эффективного выявления повторяющихся шаблонов.
Пример кода:
class Solution {
public boolean repeatedSubstringPattern(String s) {
int n = s.length();
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
String substring = s.substring(0, i);
int hash = substring.hashCode();
boolean isValid = true;
for (int j = i; j < n; j += i) {
if (s.substring(j, j + i).hashCode() != hash) {
isValid = false;
break;
}
}
if (isValid) {
return true;
}
}
}
return false;
}
}
В этой статье мы рассмотрели три различных метода обнаружения повторяющихся шаблонов подстрок в строке. Подход грубой силы предполагает проверку всех возможных подстрок, а алгоритм KMP и метод скользящего хеширования обеспечивают более оптимизированные решения. В зависимости от сложности проблемы и размера входной строки могут подойти разные методы.
Поняв эти методы, вы сможете лучше решать подобные проблемы и соответствующим образом оптимизировать свой код. Не забудьте проанализировать требования и ограничения вашей конкретной проблемы, чтобы определить наиболее подходящий подход.