Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
4 / 6 / 1
Регистрация: 16.04.2022
Сообщений: 139

Найти самую короткую подстроку, являющуюся палиндромом

07.09.2023, 00:30. Показов 2458. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ограничение времени 1 секунда
Ограничение памяти 512Mb

Аркадий — большой фанат использования машинного обучения в любой задаче. Он верит в безграничную силу волшебства этой популярной молодой науки. Именно поэтому Аркадий постоянно постоянно придумывает всё новые и новые факторы, которые можно вычислить для различных объектов.

Напомним, палиндромом называется строка, которая одинаково читается от начала к концу и от конца к началу. Для каждой строки в своей базе данных Аркадий хочет найти самую короткую её подстроку, состоящую хотя бы из двух символов и являющуюся палиндромом. Если таких подстрок несколько, Аркадий хочет выбрать лексикографически минимальную.
==============================
Формат ввода
В единственной строке входных данных записана одна строка из базы Аркадия — непустая последовательность строчных букв английского алфавита. Длина строки составляет не менее 2 и не превосходит 200000 символов.
==============================
Формат вывода:
Выведите минимальную по длине подстроку строки из входных данных, состоящую хотя бы из двух символов и являющуюся палиндромом. Напомним, что среди всех таких строк Аркадий хочет найти лексикографически минимальную.
======================================== ====================
Подстрокой называется непрерывная подпоследовательность букв строки. Например, «aba», «c», «baca», «abacaba» являются подстроками строки «abacaba», а «bc», «abaaba», «d» — нет.

Говорят, что строка a=a1a2…an лексикографически меньше строки b=b1b2…bm, если верно одно из двух условий:либо n<m и a1=b1,a2=b2,…,an=bn, то есть первая строка является префиксом второй;либо есть такая позиция 1≤i≤min(n,m), что a1=b1,a2=b2…,ai−1=bi−1 и ai<bi, то есть в первой позиции, в которой строки различаются, в первой строке стоит меньшая буква.


У меня такой код, но на 22 тесте (неизвестно что за тест) обрывается по времени. что делать?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def a(s):
    n = len(s)
    a = 0
    result = None
    def is_palindrome(substr):
        return substr == substr[::-1]
    for i in range(n):
        for j in range(i + 2, n + 1):
            substr = s[i:j]
            if is_palindrome(substr):
                if result is None or len(substr) < len(result) or (len(substr) == len(result) and substr < result):
                    result = substr
    return result if result is not None else "-1"
s = input().strip()
result = a(s)
print(result)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2023, 00:30
Ответы с готовыми решениями:

Определить самую длинную подстроку, являющуюся особой строкой
Структурные лингвисты называют особыми строки, начинающиеся и заканчивающиеся одним и тем же символом. Вам дана строка, состоящая из...

В строке найти самую длинную подстроку
С клавиатуры водится строка,найти самую длинную подстроку, которая повторяется больше одного раза в данной строке, найти сколько раз она...

Найти самую длинную неповторяющуюся подстроку
Напишите функцию, которая возвращает самую длинную неповторяющуюся подстроку для входной строки. Если несколько подстрок совпадают по...

18
44 / 31 / 13
Регистрация: 19.12.2022
Сообщений: 107
07.09.2023, 11:50
Лучший ответ Сообщение было отмечено NebraskKrasnod как решение

Решение

Матрица должна дать буст по времени.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def longest_palindrome_substring(s):
    n = len(s)
    if n < 2:
        return s
 
    dp = [[False] * n for _ in range(n)]
    start = 0
    max_length = 1
 
    for i in range(n):
        dp[i][i] = True
 
    for length in range(2, n + 1):
        for i in range(n - length + 1):
            j = i + length - 1
 
            if length == 2 and s[i] == s[j]:
                dp[i][j] = True
            elif s[i] == s[j] and dp[i + 1][j - 1]:
                dp[i][j] = True
 
            if dp[i][j] and length > max_length:
                start = i
                max_length = length
 
    return s[start:start + max_length]
 
s = input().strip()
result = longest_palindrome_substring(s)
print(result if result else "-1")
1
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
07.09.2023, 12:26
RockSun, лучший буст - норм алгос
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
07.09.2023, 13:41
Лучший ответ Сообщение было отмечено NebraskKrasnod как решение

Решение

зачем такие сложности?!
просто ищем палиндромы длины 2, если таких нет ищем палиндромы длины 3, если и таких нет выводим -1.
или я что то задачу неправильно понял...?
4
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
07.09.2023, 14:27
Цитата Сообщение от eaa Посмотреть сообщение
просто ищем палиндромы длины 2, если таких нет ищем палиндромы длины 3, если и таких нет выводим -1.
Добавить 4 еще надо: abba

Добавлено через 44 секунды
А не, все четные проверять надо
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
07.09.2023, 14:27
Red white socks, а зачем 4? если из 4х символов палиндром, то из 2х тоже.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
07.09.2023, 14:28
eaa, ступил, слона не заметил
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
07.09.2023, 15:30
eaa, иди ищем палиндром просто обычный, если длина чет, то выводим середину из 2х знаков, а если нечет, то середину из 3х
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
07.09.2023, 15:53
Python
1
2
3
4
5
6
7
8
9
def get_min_palindrom(s, le):
    return min(p for i in range(len(s)-le+1) if (p := s[i:i+le]) == p[::-1])
 
s = input('s->')
try:
    p = get_min_palindrom(s,2)
except:
    p = get_min_palindrom(s,3)
print(p)
0
44 / 31 / 13
Регистрация: 19.12.2022
Сообщений: 107
07.09.2023, 17:31
Я там немного ошибся, поменять нужно
Python
1
2
if n < 2:
    return s
на
Python
1
2
if n < 2:
    return "-1"
А то оно там не совсем то возвращает
0
4 / 6 / 1
Регистрация: 16.04.2022
Сообщений: 139
07.09.2023, 21:45  [ТС]
Цитата Сообщение от RockSun Посмотреть сообщение
Матрица должна дать буст по времени.

На тесте "yandex", должно выводить "-1", а у тебя выводит "y"

Добавлено через 4 минуты
к сожалению ошибка на неизвестном тесте, idealist.

я думаю такой сделать алгоритм:
Пусть существует какая-то подстрока, являющаяся палиндромом. Если мы уберём первый и последний символ палиндрома, оставшаяся строка тоже будет палиндромом. Будем повторять процесс до тех пор, пока не останется строка из двух или трёх букв (в зависимости от чётности).


Подстрок длины два или три всегда линейное количество, и суммарная их длина также линейна, поэтому среди таких строк ответ можно выбрать наивным алгоритмом. Если же ни одна из подстрок такой длины не является палиндромом, то выведем -1.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
07.09.2023, 21:50
NebraskKrasnod, да, такой алгоритм залетит со свистом. Остается реализовать)
1
4 / 6 / 1
Регистрация: 16.04.2022
Сообщений: 139
07.09.2023, 21:52  [ТС]
а как реализовать чтоб хорошо было
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
07.09.2023, 22:10
Цитата Сообщение от NebraskKrasnod Посмотреть сообщение
я думаю такой сделать алгоритм:
https://habr.com/ru/companies/... es/349172/
https://ai-news.ru/2018/02/yan... chiko.html

Не твой алгоритм, а так, за тебя все разжевано, осталось только написать
2
4 / 6 / 1
Регистрация: 16.04.2022
Сообщений: 139
07.09.2023, 22:59  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def a(s):
    def b(c):
        return c == c[::-1]
    n = len(s)
    for i in range(n - 1):
        if s[i] == s[i + 1]:
            return s[i:i + 2]
    for i in range(n - 2):
        if s[i] == s[i + 2]:
            return s[i:i + 3]
    return -1
d = input().strip()
r = a(d)
print(r)
сделал так, у меня ошибка на 3 тесте. тот пример который я в начале выкладывал гораздо дальшешел. может есть идеи капкието
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
07.09.2023, 23:05
Цитата Сообщение от NebraskKrasnod Посмотреть сообщение
к сожалению ошибка на неизвестном тесте, idealist
А так:
Python
1
2
3
4
5
6
7
8
9
10
11
def get_min_palindrom(s, le):
    return min(p for i in range(len(s) - le + 1) if (p := s[i:i + le]) == p[::-1])
 
s=input('s->')
try:
    print(get_min_palindrom(s, 2))
except:
    try:
        print(get_min_palindrom(s, 3))
    except:
        print(-1)
0
44 / 31 / 13
Регистрация: 19.12.2022
Сообщений: 107
07.09.2023, 23:12
NebraskKrasnod, так ты прочитал то что я после дописал? Замени строчку в моём коде
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
08.09.2023, 07:13
Лучший ответ Сообщение было отмечено NebraskKrasnod как решение

Решение

RockSun, не сработает с яндексом юзайте срезы

Добавлено через 3 минуты
Python
1
2
3
4
a = input()
 
m = [a[i:i + 2] for i in range(len(a) - 1) if a[i] == a[i + 1]]
#  дальше 2 ифа и еще одна переменная со срезом 2, должно прокатить, писать немного лень)
1
4 / 6 / 1
Регистрация: 16.04.2022
Сообщений: 139
08.09.2023, 21:25  [ТС]
Цитата Сообщение от RockSun Посмотреть сообщение
А то оно там не совсем то возвращает
Даже после изменения там двух строчек кода, на "yandex" выдает "y", а надо -1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2023, 21:25
Помогаю со студенческими работами здесь

Найдите лексикографически наибольшую подпоследовательность, являющуюся палиндромом
Вот ещё задача, если сможете D. ЛНПП ограничение по времени на тест2 секунды ограничение по памяти на тест256 мегабайт ...

Найти самую короткую строку, в которой цифр меньше, чем остальных символов
Пользователь вводит в консоль строки до тех пор, пока он не введет пустую строку. Найти самую короткую строку, в которой цифр...

Найти самую короткую подстроку являющуюся палиндромом
Аркадий — большой фанат использования машинного обучения в любой задаче. Он верит в безграничную силу волшебства этой популярной молодой...

Найти максимальную подстроку являющуюся палиндромом
Назовем строку палиндромом, если она одинаково читается слева направо и справа налево. Примеры палиндромов: «abcba», «55», «q», «xyzzyx»....

Функция, которая в заданной строке ищет подстроку, являющуюся палиндромом
Всем привет. Помогите пожалуйста написать функцию, которая в заданной строке ищет подстроку, являющуюся палиндромом, то есть такой строкой,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru