2015-03-24 2 views
0

У меня есть назначение Python, которое хочет, чтобы я написал программу, которая находит самый длинный палиндром в заданном тексте. Я знаю, что есть примеры этой функции на других языках на этом веб-сайте, но я новичок в Python, и у меня проблемы с написанием кода.Самый длинный палиндром в Python

Это, как я в настоящее время определения палиндромов:

def is_palindrome(word): 
    x = 0 
    for i in range (len(word)/2): 
     if (word[x]) == (word[len(word)-x-1]): 
      x+=1 
     if x == (len(word)/2): 
      return True 
    return False 
+0

Это, кажется, самая длинная общая проблема подпоследовательности для входов '' text'' и '' обращенно (текст) ''. LCS хорошо изучен и существует множество реализаций на многих языках, включая Python (например, [this] (http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_subsequence#Python)). Если по палиндрому вы имеете в виду отдельное слово, а не фрагмент текста. – fjarri

+0

@fjarri Да, я думаю, что этот вопрос на самом деле не такой сложный, как проблема LCS, кажется, что он основан на словах, хотя более подробная информация из OP о примере ввода поможет сделать это более понятным. – Marius

+2

'max ((слово в слово в text.lower(). Split(), если слово [:: - 1] == word), key = len)' – wim

ответ

1

Я использовал:

def Is_palindrome(word): 
    x = 0 
    for i in range (len(word)/2): 
     if (word[x]) == (word[len(word)-x-1]): 
      x+=1 
     if x == (len(word)/2): 
      return True 
    return False 

def longest_palindrome(text): 
    lst = text.split() #Split it into words (cannot have punctuation) 
    palindromes = [] #List that contains the palindromes 
    long_len = 0 #Length of the longest palindrome 
    longest = "" #The actual longest palindrome 
    for i in lst: #Loop through all the words 
     if Is_palindrome(i): #If the word is a palindrome 
      palindromes.append(i) #Add it to the palindrome list 
    for i in palindromes: #Loop through the palindrome list 
     if len(i) > long_len: #If the palindrome is longer than the longest one 
      longest = i #Set it as the longest one 
      longest_len = len(i) # Set the length of the longest one to the length of this one 
    return longest 
+0

@ TerribleCoder007 Вы хотите, чтобы он возвращал палиндромы, если они находятся в середине слова? –

4

Альтернативный способ

def Is_palindrome(word): 
     return word==word[::-1] 
# Assuming text is defined 
print max((word for word in set(text.split()) if Is_Palindrome(word)), key=len) 
+0

Пожалуйста, дайте мне знать причину голосования. Я постараюсь улучшить. – kvivek

+0

Это, похоже, не отвечает на вопрос. Вместо этого это будет комментарий. Кроме того, он не проголосовал, он имеет положительное количество голосов! –

+0

@jakeminds, Как это не отвечает на вопрос. Вы не получите ответ? – kvivek

1
def fastLongestPalindromes(seq): 
    seqLen = len(seq) 
    l = [] 
    i = 0 
    palLen = 0 
    while i < seqLen: 
     if i > palLen and seq[i - palLen - 1] == seq[i]: 
      palLen += 2 
      i += 1 
      continue 
     l.append(palLen) 
     s = len(l) - 2 
     e = s - palLen 
     for j in range(s, e, -1): 
      d = j - e - 1 
      if l[j] == d: 
       palLen = d 
       break 
      l.append(min(d, l[j])) 
     else: 
      palLen = 1 
      i += 1 
    l.append(palLen) 
    lLen = len(l) 
    s = lLen - 2 
    e = s - (2 * seqLen + 1 - lLen) 
    for i in range(s, e, -1): 
     d = i - e - 1 
     l.append(min(d, l[i])) 

    return l 
def getPalindrome(text): 
    lengths = fastLongestPalindromes(text) 
    start = 0 
    end = 0 
    length = 0 
    for i in range(len(lengths)): 
     if(lengths[i] > length): 
      length = lengths[i] 
      end = i//2+(lengths[i]//2) 
      start = i//2-(lengths[i]//2) 
      if(i%2 == 1): 
       start +=1 
    return text[start:end] 

В линейном времени. (более длинный код, но быстрее, чем другие ответы, по крайней мере, для длинных строк).

Источник: http://www.akalin.cx/longest-palindrome-linear-time (первая функция копирования вставили)

+0

Это действительно старый вопрос, но уверены ли вы, что это выполняется в линейном времени? У вас есть две вложенные петли с переменными i и j, поэтому это должно быть O (n^2) – fafl

+0

@fafl. К сожалению, вычисление сложности программы не так просто, как подсчет максимального количества вложенных циклов. Пожалуйста, прочитайте связанную статью для уточнения. Особенно комментарии в коде о инвариантах цикла должны помочь вам убедить себя, что это действительно линейно. – Soronbe

+0

Ссылка не работает, когда я написал свой предыдущий комментарий, теперь я вижу, как он работает в O (n) – fafl

Смежные вопросы