考え方は大まかに次のとおりです。与えられた文字列Sについて、同じ文字が同じ部分にのみ表示されるように、それをいくつかの部分に分割します。
アイデア:最初に文字列をスキャンし、各文字の最後の位置を記録してから、ダブルポインター文字列をトラバースし、変数endを設定して、分離されたサブストリングの最後にSの添え字を示し、変数startを設定して、サブストリングの先頭にあるSの添え字を示します。現在スキャンされている要素が最後に出現した場合の添え字がendより大きい場合は、部分文字列を拡張する必要がある
ことを意味します。Endが更新されます。現在スキャンされている要素の添え字がendに達した場合は、その部分文字列が要件と回答(サブ文字)を完全に満たしていることを意味します。文字列end-start+1
)の要素数がresに追加されstart=end+1
、次のサブ文字列の先頭を指すようにしながら、操作を繰り返します。
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;
}