```cpp
class Solution {
public:
int residuePrefixes(string s) {
bool seen[26] = {false}; // 记录当前前缀中出现的不同字符
int distinctCount = 0; // 当前前缀中不同字符的数量
int ans = 0;
for (int i = 0; i < s.size(); ++i) {
int idx = s[i] - 'a';
if (!seen[idx]) {
seen[idx] = true;
++distinctCount;
}
// 检查是否满足条件:distinctCount == len(prefix) % 3
// 前缀长度是 i + 1,模3结果是 (i + 1) % 3
if (distinctCount == (i + 1) % 3) {
++ans;
}
}
return ans;
}
};
```
核心思路:模拟与计数
这道题只需要按题意模拟即可。关键是同时维护两个信息:当前前缀的长度和其中的不同字符数量。
· 维护不同字符数:使用一个大小为26的布尔数组seen记录字符是否出现过。遍历时,每遇到一个新字符,就将distinctCount加1。
· 检查条件:对于长度为i+1的前缀,计算(i+1) % 3,然后判断是否与当前的distinctCount相等。如果相等,答案加1。
复杂度分析:时间复杂度O(n),空间复杂度O(1)。