Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2023, 01:23   #1
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию Задача: Можно ли из слова сделать палиндром? Python

Задача следующая:

Можно ли из слова сделать палиндром? Убирать можно только подстроку из трех символов (т.е. 3 символа подряд. Ни больше ни меньше.) Количество таких операций не ограничено. Палиндромом строка считается, если ее значение равно ее перевернутому значению. Т.е. это не обязательно должно быть слово(одинаковые буквы или цифры). количество символов в строке не больше 10^6

Я попытался решить, но у меня не получилось.

Пример:

Ввод: arcsinus
Вывод: YES

Ввод: abcde
Вывод: NO
Код:
s = input()
ch =list(s)
m=[]
if s == s[::-1]:
    if  (len(s) == 0):
        print("NO")
    else:
        print("YES")
        
elif len(s) > 4:
    for i in s:
        if ch.count(i)>1:
            c = s.find(i)
            if c%3==0:
                k = s.find(i,c)
                if (k - c)%4 ==0:
                    m.append(i)
                else:
                    continue
            else:
                continue
        else:
            continue
    if len(m) > 1:
        print("YES")
    else:
        print("NO")
elif 2 <len(s)<5 :
    if  (len(s)==4) and (s[1] != s[3]):
        print("NO")
    elif (len(s) == 3) and (s[0] != s [2]):
        print("NO")

Последний раз редактировалось Faserty; 22.09.2023 в 02:49.
Faserty вне форума Ответить с цитированием
Старый 22.09.2023, 03:01   #2
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию

Faserty, я понимаю, что ошибка в этом условии
Код:
elif len(s) > 4:
    for i in s:
        if ch.count(i)>1:
            c = s.find(i)
            if c%3==0:
                k = s.find(i,c)
                if (k - c)%4 ==0:
                    m.append(i)
                else:
                    continue
            else:
                continue
        else:
            continue
    if len(m) > 1:
        print("YES")
    else:
        print("NO")
но я не понимаю почему
Faserty вне форума Ответить с цитированием
Старый 22.09.2023, 11:54   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Не врубаюсь. Какие три символа надо удалить, чтобы из arcsinus получился палиндром?
У меня такой код:
Код:
s1 = input()   # Входная строка
s2 = s1[::-1]  # Инверсная строка
if not s1:     # Если строка пустая
    print('No')
elif s1 == s2: # и она уже палиндром
    print('Yes')
if len(s1) > 4:
    for i in range(len(s1) - 2):
        s1_left = s1[:i]        # Вырезали слева
        s1_right = s1[i + 3:]   # Вырезали справа
        m1 = s1_left + s1_right # Удалены три символа
        m2 = m1[::-1]           # Инверсия
        if m1 == m2:
            print('Yes')
            break               # Нашли вариант
    else:
        print('No')             # Нет варианта
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.09.2023, 12:15   #4
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию

ViktorR, sinus - inu = ss
Удалять можно только три символа, которые идут рядом. Т.е. из cosinus палиндром не получится
Faserty вне форума Ответить с цитированием
Старый 22.09.2023, 12:32   #5
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Faserty, удалять можно до переворота или после переворота?
Valick вне форума Ответить с цитированием
Старый 22.09.2023, 12:37   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

А есть разница? К примеру, 11,12,13 симолы после переворота станут 97,96,95 . И что? Результат проверки на палиндромистость будет зависеть?
digitalis вне форума Ответить с цитированием
Старый 22.09.2023, 13:52   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Faserty
Цитата:
sinus - inu = ss
Ну да. Только надо читать внимательнее. В вашем примере 'arcsinus'.
Первый пост:
Цитата:
Пример:

Ввод: arcsinus
Вывод: YES
А предложенный код подходит?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.09.2023, 15:15   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
В вашем примере 'arcsinus'.
Цитата:
Сообщение от Faserty Посмотреть сообщение
Количество таких операций не ограничено.
arcsinus - arc - inu = ss
Цитата:
Сообщение от Faserty Посмотреть сообщение
Т.е. из cosinus палиндром не получится
Да, вроде, тоже палиндром: cosinus - cos - inu = s.
Пока мне очевиден только случай, когда остаток от деления длины строки на 3 равен 1, тогда это палиндром.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.09.2023, 15:41   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Извините, пропустил фразу:
Цитата:
Количество таких операций не ограничено.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 22.09.2023, 18:41   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вроде работает (при сравнении с "очевидным" алгоритмом проверки быстро примеры расхождения не нашлись):
Код:
import string
import random
import timeit

def is_palindrome_naive(s):
    len_s = len(s)
    if len_s == 0:
        return False
    if s == s[::-1]:
        return True
    for i in range(len_s - 2):
        r = is_palindrome_naive(s[:i] + s[i + 3:])
        if r:
            return True
    return False

def is_palindrome_fast(s):
    len_s = len(s)
    if len_s == 0:
        return False
    elif len_s % 3 == 1:
        return True
    else:
        offset = (len_s + 2) % 3
        for i in range(0, len_s - offset, 3):
            for j in range(i + offset, len_s, 3):
                if s[i] == s[j]:
                    #print(i, j)
                    return True
        return False

# speed check
test_str = string.ascii_lowercase[:14]
print(timeit.timeit('is_palindrome_naive(test_str)', number = 1000, globals = globals()))
print(timeit.timeit('is_palindrome_fast(test_str)',  number = 1000, globals = globals()))

# equivalence check
i = 0
pal_count = 0
while True:
    i += 1
    s = "".join([random.choice(string.ascii_lowercase) for _ in range(random.randint(5, 10))])
    r1 = is_palindrome_naive(s)
    r2 = is_palindrome_fast(s)
    if r1 != r2:
        print(s)
        break
    if r1:
        pal_count += 1
    if i % 100000 == 0:
        print(i, pal_count)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]. Задача на String: заданы два слова, проверить, можно ли из букв первого слова сложить второе слово VonrLyStap Помощь студентам 3 05.12.2017 09:49
Даны два слова. Составьте программу, определяющую можно или нет из букв слова А составить слово В. Конь Антон Паскаль, Turbo Pascal, PascalABC.NET 3 10.06.2015 14:44
Даны два слова. Составьте программу, определяющую можно или нет из букв слова А составить слово В Конь Антон Помощь студентам 1 24.05.2015 16:43
Задача на палиндром Me gusta Паскаль, Turbo Pascal, PascalABC.NET 2 27.03.2013 19:17