嘿伙計們,我正在 algoExpert 平臺上解決這個問題,但我很難理解最長和當前最長在做什么。
def longestPalindromicSubstring(string):
currentLongest = [0, 1]
for i in range(1, len(string)):
odd = getLongestPalindromeFrom(string, i - 1, i 1)
even = getLongestPalidromeFrom(string, i - 1, i)
longest = max(odd, even, key=lambda x: x[1] - x[0])
currentLongest = max(longest, currentLongest, key=lambda x: x[1] - x[0])
return string[currentLongest[0] : currentLongest[1]]
def getLongestPalindromeFrom(string, leftIdx, rightIdx):
while leftIdx >= 0 and rightIdx < len(string):
if string[leftIdx] != string[rightIdx]:
break
leftIdx -= 1
rightIdx = 1
return [leftIdx 1, rightIdx]
從一開始,我就不確定currentLongest = [0, 1]它在做什么,它只是說它將有 2 個值嗎?奇數和偶數是否回傳索引陣列?
longest我知道它在奇數和偶數之間取最大值,鍵似乎正在使用 **匿名函式 lambda ** 但我不太確定鍵的作用以及x: x[1] - x[0] 的作用。我也不明白currentLongest最大值在做什么。像傳遞longest和的目的是currentLongest什么?它們都是串列,所以我不完全確定那里發生了什么。作為回報,如果我們得到類似[3:9]on 的資訊longest,我認為我們所做的就是將字串切片 asstring(3:9)但是串列的使用使我和max和key:lambda讓我更加困惑。任何幫助表示贊賞!
描述:撰寫一個函式,給定一個字串,回傳其最長的回文子字串。回文被定義為向前和向后寫入相同的字串。請注意,單字串是回文。您可以假設只有一個最長的回文子串。
樣本輸入:
string = "abaxyzzyxf"
示例輸出:
"xyzzyx"
感謝 Daniel Hao 要求提供更多說明,并感謝 Prasad Darshana 關于如何更好地格式化我的代碼行的建議。我是 Stack Overflow 的新手,所以這非常有幫助,因此我下次可以知道如何格式化并提出更好的問題!
uj5u.com熱心網友回復:
經過一番猜測,我想我明白了,并建議您嘗試以下代碼,看看是否可以幫助您posted更好地理解代碼:
[注意]這不是直接的答案,而是嘗試揭開復雜代碼的神秘面紗并提出建議解決這個問題的替代方法,或者作為參考。
def longestPalindromeSub(string):
N = len(string)
for i in range(N)[::-1]:
for idx in range(N-i):
word = string[idx: idx i 1]
if word == word[::-1]: # palindrome is symmetric
return word
return '' # not found
使用 word = 'racecar' 跑步
>>> print(longestPalindromeSub(word))
`racecar`
>>> print(longestPalindromeSub('mississippi'))
'ississi'
uj5u.com熱心網友回復:
currentLongest = [0, 1],這是最初的假設。在這段代碼中,假設最長的回文子串是一個從 0 開始到 1 結束的字串。
例如:
如果給定的字串abcdc假設currentLongest為a(從索引 0 到 1)。
然后在longestPalindromicSubstring函式中的 for 回圈中,它檢查索引并將其加一。在even,和odd情況下。它得到偶數長度和奇數長度的子串來檢查。您可以通過傳遞給getLongestPalidromeFrom函式的值來檢查長度。( (i-1),(i),(i 1) length= 3 odd).
在getLongestPalidromeFrom函式中,它將長度增加 2 并檢查它是否是回文。然后回傳可以通過開始給定點生成的最長回文子串。
在longest它檢查什么是最長的子字串 fromodd和evenlength 字串。然后在currentLongest其中將新的最長值與之前的最長 (cuurentLongest) 值進行比較。
記住索引currentLongest, longest是子串開始和結束的索引。所以長度等于x[1]-x[0]。拉姆達函式。
在我的解釋中,索引可能有一些錯誤。但完全是這樣的。
uj5u.com熱心網友回復:
currentLongest和之間的區別longest
currentLongest跟蹤迄今為止通過迭代找到的最長回文的開始和結束索引。currentLongest初始化為currentLongest = [0,1],因此即使字串長度為 1 個字符,for 回圈也不會執行并回傳單個字符(通過return string[currentLongest[0]:currentLongest[1]])。
longest保留在單次迭代中找到的最長回文的開始和結束索引。這是通過對 2 個陣列執行 lambda 操作來檢索的:奇數和偶數。
- x: x[1] - x[0] 是做什么的?
lambda 操作以這種方式比較兩個陣列,奇數和偶數(x 表示每個陣列):它取每個陣列并從結束索引(1)中減去開始索引(0),并輸出具有最大差值的陣列/開始和結束索引之間的距離。(表示最長的子串回文)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313540.html
上一篇:IndexError:串列索引超出范圍:更改代碼格式時
下一篇:列印字串所需的最短時間
