Notas de cepillado de Leetcode (C++) - ventana deslizante

Notas de cepillado de Leetcode (C++) - ventana deslizante

Ordene las ideas en el proceso de repasar las preguntas, resúmalas y compártalas aquí.
dirección de github: https://github.com/lvjian0706/Leetcode-solutions
El proyecto de github se creó recientemente, y el código y las ideas se cargarán uno tras otro. El código está basado en C++ y python. Al mismo tiempo, el algoritmo de clasificación básico también se clasificará y cargará.

3. La subcadena más larga sin caracteres repetidos

Dada una cadena, encuentre la longitud de la subcadena más larga que no contiene caracteres repetidos.

Ejemplo 1:
Entrada: "abcabcbb"
Salida: 3
Explicación: Dado que la subcadena más larga sin caracteres repetidos es "abc", su longitud es 3.
Ejemplo 2:
Entrada: "bbbbb"
Salida: 1
Explicación: Dado que la subcadena más larga sin caracteres repetidos es "b", su longitud es 1.
Ejemplo 3:
Entrada: "pwwkew"
Salida: 3
Explicación: Dado que la subcadena más larga sin caracteres repetidos es "wke", su longitud es 3.
Tenga en cuenta que su respuesta debe ser la longitud de la subcadena, "pwke" es una subsecuencia, no una subcadena.

class Solution {
    
    
public:
    /*
    找出不含有重复字符的最长子串的长度.
    最长子串思路:使用滑动窗口遍历字符串,当碰到新元素时将其append到当前子串中,同时记录此时的子串长度,并及时更新最长的字串长度;当碰到的元素不是新元素(已经在子串中出现过)时,子串左端开始收缩,直到将与新碰到的元素一样的元素被剔除出子串为止;
    1. 定义map用来记录元素出现个数,定义两个int值用来记录当前子串长度以及最长子串长度;
    2. 当当前元素在子串中出现过时,说明当前元素在子串中重复,因此将左边界收缩,直到碰到右边界或当前元素在子串中不重复,子串的长度随着左边界收缩即使更新;
    3. 此时当前元素在子串中一定不重复,因此将其append到当前子串中,同时记录此时的字串长度,并及时更新最长的字串长度;
    */
    int lengthOfLongestSubstring(string s) {
    
    
        if(s.length()==0) return 0;
        map<char, int> num_char;
        int now_ans = 0;
        int max_ans = 0;
        int left = 0;
        for(int i=0; i<s.length(); i++){
    
    
            if(num_char.find(s[i])==num_char.end()){
    
    
                num_char[s[i]] = 0;
            }
        }
        for(int i=0; i<s.length(); i++){
    
    
            while(num_char[s[i]]==1){
    
    
                num_char[s[left]]--;
                left++;
                now_ans--;
            }
            num_char[s[i]]++;
            now_ans++;
            if(now_ans>max_ans) max_ans = now_ans;
        }
        return max_ans;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43273742/article/details/107741490
Recomendado
Clasificación