classSolution { public: vector<int> partitionLabels(string S){ vector<int> ans, loc(26, 0); int n = S.length(); for (int i = 0; i < n; i++) loc[S[i] - 'a'] = i;
for (int i = 0; i < n;) { int lastIdx = loc[S[i] - 'a']; // 获取开始字符的最后出现位置 for (int j = i + 1; j < lastIdx; j++) // 这里可以适当剪枝,已经访问过的字符之后不需要再重复访问了,因为其最后出现的位置还是不变的。 lastIdx = max(lastIdx, loc[S[j] - 'a']); ans.push_back(lastIdx - i + 1); i = lastIdx + 1; }