Diario de escritura de preguntas de LeetCode 003: la subcadena más larga sin repetición

LeetCode3—— La subcadena más larga sin repetición

Hora de finalización: 2022/09/15

Tallo de la pregunta

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

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

ideas propias

   Dado que la pregunta requiere la subcadena más larga sin repetición, es natural pensar en usar dos punteros para atravesar la cadena, y luego, naturalmente, pensamos en conjuntos matemáticos para palabras clave sin repetición. Por lo tanto, la idea es muy clara: solo necesitamos agregar los caracteres que hemos atravesado al conjunto y luego verificar si el conjunto se ha incluido en el conjunto al ver el siguiente carácter. Si está incluido en el conjunto, entonces actualizamos la variable de registro con la longitud máxima maxLengthy el valor es j-i, porque la duplicación ocurre en este momento y la posición de j ya está en la cadena duplicada, que simplemente suma el número del cadena inicial para nosotros, por lo que, de hecho j-i+1-1, está simplificada a j-i.

   Durante el proceso de prueba, encontramos una situación especial, es decir, "qwert0 *894/"no hay repetición de principio a fin, como no hay repetición, no podemos actualizar la nuestra en función de si está incluida en el conjunto maxLength, pero Consideramos que en este caso el segundo puntero debe haber apuntado al final de la cadena. Entonces podemos agregar un juicio final. Si el segundo puntero llega al final, lo actualizaremos nuevamente maxLength, pero en este momento j-i+1, debido a que no hemos repetido y llegado al final de la cadena, necesitamos complementar el carácter inicial. .

   La complejidad del tiempo es 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;
    }
};

Ideas para resolver problemas

   Use una ventana deslizante, un puntero izquierdo de la ventana, un puntero derecho de la ventana y use un conjunto para guardar los caracteres en la ventana. Si se produce una duplicación, el puntero izquierdo de la ventana se mueve un bit hacia la derecha y los caracteres transpuestos se borran en el colocar. Similar a mi propio pensamiento.

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;
    }
};

código de prueba

#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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43419761/article/details/130263119
Recomendado
Clasificación