Leetcode Interview Frage 48. Die längste Teilzeichenfolge ohne wiederholte Zeichen [Dynamische Programmierung]

Problembeschreibung

Suchen Sie den längsten Teilstring, ohne die Zeichen aus der Zeichenfolge zu wiederholen, und berechnen Sie die Länge des längsten Teilstrings.

Problemlösungsbericht

d p [ ich ]] dp [i] bedeutet ich ich Die Länge des längsten Teilstrings, der mit Zeichen endet.
Denken Sie daran d p [ ich - - 1 ]] dp [i-1] Die Ausgangsposition ist p p
suchen d p [ ich ]] dp [i] :

  • Rückwärtsfahrt s [ ich - - 1 ]] , s [ ich - - 2 ]] , , s [ p ]] s [i-1], s [i-2], \ cdots, s [p] ,
  • Wenn es nicht existiert s [ j ]] = = s [ ich ]] s [j] == s [i] , die d p [ ich ]] = d p [ ich - - 1 ]] + 1 dp [i] = dp [i-1] +1 p p bleibt unverändert;
  • Wenn es existiert s [ j ]] = = s [ ich ]] s [j] == s [i] , die d p [ ich ]] = ich - - j dp [i] = ij , währenddessen p p aktualisiert j j

Zeitliche Komplexität: Am besten ist es Die ( N. ) O (N) , das Schlimmste ist Die ( N. 2 ) O (N ^ 2)
Raumkomplexität: Die ( N. ) O (N)

Implementierungscode

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size(),ans=1,flag=0,i,j,p=0;
        if(n==0) return 0;
        vector<int>dp(n,1);
        for(i=1;i<n;i++){
            for(j=i-1;j>=p;j--){
                if(s[i]==s[j]){
                    flag=1;
                    break;
                }
            }
            if(!flag)
                dp[i]=dp[i-1]+1;
            else{
                dp[i]=i-j;
                p=j;
                flag=0;
            }
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

Referenzen

[1] Leetcode Interview Frage 48. Die längste Teilzeichenfolge ohne wiederholte Zeichen

MD_
Veröffentlicht 139 Originalarbeiten · erntete Lob 8 · Ansichten 10000 +

Ich denke du magst

Origin blog.csdn.net/qq_27690765/article/details/105439787
Empfohlen
Rangfolge