Leetcode una pregunta del día: 763.partition-labels (intervalo de letras de partición)

Inserte la descripción de la imagen aquí
El significado de la pregunta es aproximadamente: para la cadena dada S, divídala en varias partes, de modo que la misma letra solo aparezca en la misma parte;

Idea: primero escanee la cadena y registre la última posición de cada carácter; luego usePuntero dobleAtraviese la cadena y establezca la variable end para indicar el subíndice en S al final de la subcadena separada, y la variable start para indicar el subíndice en S al comienzo de la subcadena; si es la última aparición del elemento actualmente escaneado Si el subíndice de es mayor que end, significa que la subcadena debe extenderse. End se actualiza.
Si el subíndice del elemento escaneado actualmente ha llegado al final, significa que la subcadena cumple completamente los requisitos y la respuesta (subcaracter El número de elementos en la cadena end-start+1) se agrega a res, mientras se deja start=end+1que apunte al encabezado de la siguiente subcadena, se repite la operación;
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

vector<int> partitionLabels(string S)
{
    
    
    unordered_map<char, int> m;
    vector<int> v;
    int len = S.size();
    //记录记录字母最后一次出现的位置
    for (int i = 0; i < len; i++)
    {
    
    
        m[S[i]] = i;
    }
    int start = 0, end = 0;
    for (int i = 0; i < len; i++)
    {
    
    
        end = max(end, m[S[i]]);
        if (i == end) //如果i遍历到end(即该部分字符串的结尾),说明该子字符串已符合要求,那么改变start的值对下一部分字符串遍历;
        {
    
    
            v.push_back(end - start + 1);
            start = i + 1;
        }
    }
    return v;
}

Supongo que te gusta

Origin blog.csdn.net/wyll19980812/article/details/109214783
Recomendado
Clasificación