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

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

07.09.2023, 00:30. Показов 2544. Ответов 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,706
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,706
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru