например, "ccddcc" в строке "abaccddccefe"
Я подумал о решении, но оно работает за время O (n ^ 2)
Алго 1:
Шаги: это метод грубой силы
- Имейте 2
цикла for для i = от 1 до i меньше array.length -1
для j = i + 1 to j меньше, чем array.length - Таким образом можно получить подстроку всех возможных комбинаций из массива
- Имейте функцию палиндрома, которая проверяет, является ли строка палиндромом
- поэтому для каждой подстроки (i, j) вызовите эту функцию, если это палиндром, сохраните ее в строковой переменной
- Если вы нашли следующую подстроку палиндрома и если она больше текущей, замените ее текущей.
- Наконец, ваша строковая переменная получит ответ
Проблемы: 1. Этот алгоритм работает за время O (n ^ 2).
Алго 2:
- Переверните строку и сохраните ее в другом массиве
- Теперь найдите самую большую совпадающую подстроку между двумя массивами
- Но это тоже выполняется за время O (n ^ 2)
Можете ли вы, ребята, придумать алгоритм, который будет работать в лучшее время. Если возможно O (n) раз
algorithm
palindrome
Ученик
источник
источник
O(n^2)
получить подстроки *,O(n)
чтобы проверить, являются ли они палиндромами, всегоO(n^3)
?Ответы:
Вы можете найти самый дли палиндром , используя алгоритм Manacher в в то
O(n)
время! Его реализацию можно найти здесь и здесь .Для ввода
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
он находит правильный вывод, который есть1234567887654321
.источник
while
встроенныйfor
элемент с ограничением, похожим на внешний цикл.Алго 2 может работать не для всех строк. Вот пример такой строки «ABCDEFCBA».
Не то, чтобы в строке были подстроки «ABC» и «CBA». Если вы перевернете исходную строку, это будет «ABCFEDCBA». и самая длинная совпадающая подстрока - «ABC», которая не является палиндромом.
Возможно, вам потребуется дополнительно проверить, действительно ли эта самая длинная совпадающая подстрока является палиндромом, время выполнения которого равно O (n ^ 3).
источник
Насколько я понял проблему, мы можем найти палиндромы вокруг центрального индекса и охватить наш поиск в обоих направлениях, справа и слева от центра. Учитывая это и зная, что в углах ввода нет палиндрома, мы можем установить границы равными 1 и длиной -1. Обращая внимание на минимальную и максимальную границы String, мы проверяем, совпадают ли символы в позициях симметричных индексов (справа и слева) для каждой центральной позиции, пока мы не достигнем нашего максимального центра верхней границы.
Внешний цикл - O (n) (макс. N-2 итераций), а внутренний цикл while - O (n) (макс. Около (n / 2) - 1 итерация)
Вот моя реализация Java на примере, предоставленном другими пользователями.
Результат будет следующим:
источник
expandAroundCenter
.с регулярным выражением и рубином вы можете сканировать короткие палиндромы следующим образом:
источник
Я написал следующую программу на Java из любопытства, простой и понятный HTH. Спасибо.
источник
Мне недавно задали этот вопрос. Вот решение, которое я [в конце концов] придумал. Я сделал это на JavaScript, потому что на этом языке это довольно просто.
Основная концепция заключается в том, что вы идете по строке в поисках наименьшего возможного многосимвольного палиндрома (двух- или трехсимвольного). Как только вы его получите, расширьте границы с обеих сторон, пока он не перестанет быть палиндромом. Если эта длина больше текущей самой длинной, сохраните ее и двигайтесь дальше.
Это определенно можно было бы очистить и немного оптимизировать, но он должен иметь довольно хорошую производительность во всех случаях, кроме худшего (строка с той же буквой).
источник
i
j
l
s
if
и государственной поддержки. множественные точки возврата, крайние случаи ...Привет, вот мой код, чтобы найти самый длинный палиндром в строке. Пожалуйста, обратитесь к следующей ссылке, чтобы понять алгоритм http://stevekrenzel.com/articles/longest-palnidrome
Используемые тестовые данные: HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
источник
См. Статью в Википедии по этой теме. Пример реализации Java- алгоритма Манакера для линейного O (n) решения из статьи ниже:
источник
Эффективное
Regexp
решение, исключающее грубую силуНачинается со всей длины строки и сокращается до 2 символов, существует, как только найдено соответствие
Для
"abaccddccefe"
регулярного выражения проверяется 7 совпадений перед возвратомccddcc
.vbs
vba
функция
источник
источник
Попробуйте строку - «HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE»; Это должно работать для четных и нечетных друзей. Большое спасибо Мохиту!
используя пространство имен std;
источник
isPal
- операцию O (n) - только для измерения ее длины !? Также у него есть ошибка при обработке даже палиндромов. О багах четного палиндрома:else if(input_str[i] == input_str[j])
никогда не может быть успешным, потому что тот же самый тест, должно быть, не прошел в предыдущемif
утверждении; и в любом случае он глючит, потому что вы не можете определить, просто взглянув на 2 символа, разнесенные на 2 позиции друг от друга, смотрите ли вы на четный палиндром или на нечетный (рассмотритеAAA
иAAAA
).Следующий код вычисляет Palidrom для строк четной и нечетной длины.
Не лучшее решение, но работает в обоих случаях
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
источник
Используя это, мы можем найти все палиндромы любой длины.
Образец :
слово = abcdcbc
ModifiedString = a # b # c # d # c # b # c
palinCount = 1010105010301
длина самого длинного палиндрома = 5;
самый длинный палиндром = bcdcb
public class MyLongestPalindrome {
}
источник
Это вернет самую длинную строку палиндрома из данной строки
== ВЫХОД ===
Ввод: abcccde Вывод: ccc
Ввод: abcccbd Выход: bcccb
Вход: abedccde Выход: edccde
Ввод: abcccdeed Вывод: документ
Ввод: abcccbadeed Вывод: abcccba
источник
Вот реализация на javascript:
источник
Для линейного решения вы можете использовать алгоритм Манахера. Существует еще один алгоритм, вызывающий алгоритм Гасфилда, и ниже приведен код на java:
Вы можете найти больше о других решениях, таких как лучшее решение O (n ^ 2) или алгоритм Манакера, в моем собственном блоге .
источник
Здесь я написал логику, попробуй :)
источник
Это решение имеет сложность O (n ^ 2). O (1) - сложность пространства.
источник
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
источник
Вот мой алгоритм:
1) установите текущий центр как первую букву
2) одновременно расширяйте влево и вправо, пока не найдете максимальный палиндром вокруг текущего центра
3) если найденный вами палиндром больше предыдущего, обновите его.
4) установите текущий центр как следующую букву
5) повторите шаги 2) - 4) для всех букв в строке.
Это выполняется за O (n).
Надеюсь, поможет.
источник
Ссылка: Wikipedia.com
Лучший алгоритм, который я когда-либо находил, со сложностью O (N)
источник
мое решение:
источник
Substring()
и строкового равенства (==
). Он в основном идентичен алгоритму OP №1.