LINUX.ORG.RU

Оцените мою программу (функцию) на Питоне

 , ,


0

2

У меня две версии. Интересно ваше мнение. )) Нормально написана или нет?

Ищет самый длинный палиндром-подстроку (одинаково читающуюся в обоих направлениях) в строке/тексте.
Возвращает положение этого палиндрома в заданном тексте
1)

def subpalindr(text):
    try:
        l=len(text)
        text=text.lower()
        reversed_text=text[::-1]
        result=[]
        for i in range(l):
            result+=[(i,j+1) for j in range(i+2,l) if text[i:j+1] in reversed_text]
        return max(result,key=lambda a: a[1]-a[0])
    except:
        return(0,0)

2)

def subpalindr(text):
    try:
        l=len(text)
        text=text.lower()
        reversed_text=text[::-1]
        result=[]
        i=0
        while i<=l-3:
            j=i+3
            while text[i:j] in reversed_text and j<=l:
                j+=1
            result+=[(i,j-1)]
            i=j-1
        return max(result,key=lambda a: a[1]-a[0]) if len(result)>1 else result[0]
    except:
        return(0,0)

Перемещено leave из general



Последнее исправление: leave (всего исправлений: 3)

ещё один простой вариантец

def find_p(text):
    text = text.lower()
    max_len = 0
    max_index = 0
    
    for i in range(len(text)-1):
        odd_sym = True
        even_sym = True
        sym_type = 1    # odd
        k = 1

        while i+k < len(text):
            odd_sym  = odd_sym  and (i-k >= 0)   and (text[i-k]   == text[i+k])
            even_sym = even_sym and (i-k+1 >= 0) and (text[i-k+1] == text[i+k])

            if odd_sym or even_sym:
                k += 1
            else:
                break

            sym_type = odd_sym      # 1 or 0, odd or even

        if k > 1:
            k -= 1
            pali_len = 2*k + sym_type
            if pali_len > max_len:
                max_len = pali_len
                max_index = i-k + (1-sym_type)
    
    a = max_index
    b = max_index + max_len
    return a, b, text[a:b]

20 МБ файл проходит за 8 секунд на моём i7.

vvn_black, твой вариант со строкой '1234 -4321 lul' вернёт (0, 0) вот из-за этого условия - if a[i][j] >= result[2]:. наверное лучше сразу на палиндромность проверять.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.