LeetCode-Frage zum Schreiben von Tagebuch 003 – der längste Teilstring ohne Wiederholung

LeetCode3 – Der längste Teilstring ohne Wiederholung

Fertigstellungszeit: 15.09.2022

Fragenstamm

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

eigene Ideen

   Da die Frage die längste Teilzeichenfolge ohne Wiederholung erfordert, ist es naheliegend, daran zu denken, zwei Zeiger zum Durchlaufen der Zeichenfolge zu verwenden. Dann denken wir natürlich an Mengen in der Mathematik für Schlüsselwörter ohne Wiederholung. Daher ist die Idee sehr klar: Wir müssen nur die Zeichen, die wir durchlaufen haben, zum Satz hinzufügen und dann prüfen, ob der Satz im Satz enthalten ist, wenn wir das nächste Zeichen anzeigen. Wenn es im Satz enthalten ist, aktualisieren wir die Datensatzvariable mit der maximalen Länge maxLengthund dem Wert j-i, da zu diesem Zeitpunkt eine Duplizierung erfolgt und sich die Position von j bereits in der Duplikatzeichenfolge befindet, wodurch nur die Nummer hinzugefügt wird Anfangszeichenfolge für uns, also j-i+1-1wird es tatsächlich zu vereinfacht j-i.

   Während des Testprozesses sind wir auf eine besondere Situation gestoßen "qwert0 *894/", maxLengthd Wir gehen davon aus, dass in diesem Fall der zweite Zeiger auf das Ende der Zeichenfolge gezeigt haben muss. So können wir ein abschließendes Urteil hinzufügen. Wenn der zweite Zeiger das Ende erreicht, aktualisieren wir ihn erneut maxLength. Da wir dieses Mal jedoch j-i+1nicht wiederholt und das Ende der Zeichenfolge erreicht haben, müssen wir das Anfangszeichen ergänzen. Zeichenfolge.

   Die Zeitkomplexität beträgt O(n^2).

#include <string>
#include <set>
using namespace std;

class Solution {
    
    
public:
    int lengthOfLongestSubstring(string s) {
    
    
        if (s.length() <= 1) {
    
    
            return s.length();
        }

        set<char> charHash;
        int maxLength = 0;

        for (int i = 0; i < s.length()-1; i++) {
    
    
            charHash.insert(s[i]);
            for (int j = i + 1; j < s.length(); j++) {
      
      
                int exist = charHash.count(s[j]);
                charHash.insert(s[j]);
                if (exist) {
      
      
                    maxLength = maxLength > (j - i) ? maxLength : (j - i);  // 更新最大子串长度
                    break;
                }
                if (j == s.length() - 1) {
    
    
                    maxLength = maxLength > (j - i + 1) ? maxLength : (j - i + 1);  // 更新最大子串长度
                }
            }
            charHash.clear();
        }

        return maxLength;
    }
};

Ideen zur Problemlösung

   Mithilfe eines Schiebefensters, eines linken Fensterzeigers und eines rechten Fensterzeigers wird ein Satz zum Speichern der Zeichen im Fenster verwendet. Wenn eine Duplizierung auftritt, bewegt sich der linke Fensterzeiger um eine Position nach rechts und die transponierten Zeichen werden im Fenster gelöscht Satz. Ähnlich meiner eigenen Denkweise.

class Solution {
    
    
public:
    int lengthOfLongestSubstring(string s) {
    
    
        set<char> charSet;
        int n = s.length();
        int rk = -1;    // 滑动窗的右指针
        int maxLength = 0;

        for (int i = 0; i < n; i++) {
    
    
            if (i != 0) {
    
    
                charSet.erase(s[i-1]);
            }

            while (rk < n-1 && !charSet.count(s[rk + 1])) {
    
    			// 右指针寻找有无重复字符
                charSet.insert(s[rk + 1]);
                rk++;
            }

            maxLength = max(maxLength, (rk - i + 1));
        }

        return maxLength;
    }
};

Testcode

#include "Solution.cpp"
#include <iostream>
using namespace std;

int main(void) {
    
    
	string s = "";
	Solution solution;

	int maxLength  = solution.lengthOfLongestSubstring(s);
	//cout << s.length();
	cout << maxLength;

	return 0;
}

Ich denke du magst

Origin blog.csdn.net/qq_43419761/article/details/130263119
Empfohlen
Rangfolge