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+1
que apunte al encabezado de la siguiente subcadena, se repite la operación;
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;
}