Häufige Fragen zum Palindrom

1. Der längste Palindrom-Teilstring

Diese Frage sollte sorgfältig erklärt werden. Ich habe sie mehrmals gemacht und dann nach einiger Zeit vergessen. Um sie zusammenzufassen, nehmen Sie sie heraus, wenn Sie sie vergessen haben, und verwenden Sie zwei weitere verständliche Methoden, um sie zu machen.

Gehen Sie zuerst zum dynamischen Programmiercode

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if not s:
            return ''
        n = len(s)
        maxlen = 0
        res = 0
        dp = [[False for _ in range(n)]for _ in range(n)]
        for j in range(n):
            for i in range(j+1):
                dp[i][j] = s[i]==s[j] and (j-i<=2 or dp[i+1][j-1])
                if dp[i][j]:
                    if j-i+1>maxlen:
                        maxlen = j-i+1
                        res = s[i:j+1]
        return res

Nehmen wir als Beispiel s = 'babad', j geht immer rückwärts, i ist von 0 bis j und beurteilt ständig, so dass die zweischichtige for-Schleife wie im Code geschrieben wird, wenn j = 4, i von 0 bis geht 4. Suchen Sie dann das längste Palindrom

Natürlich gibt es auch andere Möglichkeiten, die zweischichtige for-Schleife zu schreiben. Das Bild stammt aus der Quelle

image.png

dp [i] [j] gibt an, ob s [i] und s [j] gleich sind. Wenn sie gleich sind und dp [i + 1] [j-1] ebenfalls gleich ist, bedeutet dies, dass das vorherige ein Palindrom ist Teilzeichenfolge, und fügen Sie dann Go für diese beiden hinzu. Also dp [i] [j] = s [j] == s [j] && dp [i + 1] [j-1], aber wenn man sich den Code ansieht, gibt es auch eine Option ji <= 2 für das Folgende Gründe dafür:

s = 'babad', wenn i = 0, j = 2, ji = 2 und s [j] == s [j], ist nur ein Element a in der Mitte definitiv ein Palindrom, daher besteht keine Notwendigkeit zu urteilen dp [i + 1] [j-1], es ist direkt richtig.

Und j-i <= 2 sollte vor dp [i + 1] [j-1] geschrieben werden, sonst wird ein Fehler gemeldet, denn wenn i = 1, j = 2, wenn Sie dp [i + 1] [j- 1], dann wird i 2 und j wird 1, was aus der Analyse gerade jetzt falsch ist, weil j ständig rückwärts geht und i von 0 bis j ist, i jenseits von j ist, also auf keinen Fall. Die anderen Teile sind besser zu verstehen, daher werde ich sie nicht erklären

Die zweite Methode:

class Solution:
    def __init__(self):
        self.res = ''
    def longestPalindrome(self, s: str) -> str:
        if not s:
            return ''
        for i in range(len(s)):
            self.helper(s,i,i)
            self.helper(s,i,i+1)
        return self.res
    def helper(self,s,left,right):
        while left>=0 and right<len(s) and s[left]==s[right]:
            left-=1
            right+=1
        cur = s[left+1:right]
        if len(cur)>len(self.res):
            self.res = cur 

Diese Methode übernimmt die zentrale Diffusionsmethode

Verteilen Sie sich von der Mitte nach beiden Seiten, aber die Länge der Zeichenfolge kann ungerade oder gerade sein. Schreiben Sie sie also zweimal direkt. Das Ergebnis ist das gleiche

2. Die längste Palindrom-Subsequenz

Code zuerst

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        if not s:
            return 0
        n = len(s)
        dp = [[0 for _ in range(n)]for _ in range(n)]
        for i in range(n):
            dp[i][i] = 1
        for i in range(n-1,-1,-1):
            for j in range(i+1,n):
                if s[i]==s[j]:
                    dp[i][j] = dp[i+1][j-1]+2
                else:
                    dp[i][j] = max(dp[i][j-1],dp[i+1][j])
        return dp[0][n-1]

Der Kerncode lautet wie folgt: Tatsächlich ist er leichter zu verstehen. Wenn die Buchstaben an beiden Enden gleich sind, addieren Sie 2 zur Länge, andernfalls hängt es von der Länge der Teilzeichenfolgen auf beiden Seiten ab und nehmen Sie die längste.

if s[i]==s[j]:
    dp[i][j] = dp[i+1][j-1]+2          
else:
    dp[i][j] = max(dp[i][j-1],dp[i+1][j])
                   

Bei zwei for-Schleifen legt die erste for-Schleife die Position von i von hinten fest. Wenn die Zeichenfolge "bbbab" ist und i auf die zweite Position zeigt, beginnt j bei der dritten und geht rückwärts und nacheinander. Vergleichen Sie den Buchstaben am i -te Position

Ich denke du magst

Origin blog.csdn.net/Matrix_cc/article/details/108691638
Empfohlen
Rangfolge