3803. 统计残差前缀
题目描述
给你一个仅由小写英文字母组成的字符串 s。
如果字符串 s 的某个 前缀 中 不同字符的数量 等于 len(prefix) % 3,则该前缀被称为残差前缀(residue)。
返回字符串 s 中 残差前缀 的数量。
字符串的 前缀 是一个 非空子字符串,从字符串的开头起始并延伸到任意位置。
示例 1:
输入: s = "abc"
输出: 2
解释:
- 前缀
"a"有 1 个不同字符,且长度模 3 为 1,因此它是一个残差前缀。 - 前缀
"ab"有 2 个不同字符,且长度模 3 为 2,因此它是一个残差前缀。 - 前缀
"abc"不满足条件,因此不是残差前缀。
因此,答案是 2。
示例 2:
输入: s = "dd"
输出: 1
解释:
- 前缀
"d"有 1 个不同字符,且长度模 3 为 1,因此它是一个残差前缀。 - 前缀
"dd"有 1 个不同字符,但长度模 3 为 2,因此它不是残差前缀。
因此,答案是 1。
示例 3:
输入: s = "bob"
输出: 2
解释:
- 前缀
"b"有 1 个不同字符,且长度模 3 为 1,因此它是一个残差前缀。 - 前缀
"bo"有 2 个不同字符,且长度模 3 为 2,因此它是一个残差前缀。 - 前缀
"bob"不满足条件。
因此,答案是 2。
提示:
1 <= s.length <= 100s仅包含小写英文字母。
解法
方法一:哈希表
我们用一个哈希表 \(\textit{st}\) 来记录当前前缀中出现过的不同字符的集合。遍历字符串 \(s\) 的每个字符 \(c\),将其加入集合 \(\textit{st}\) 中,然后判断当前前缀的长度对 \(3\) 取模的结果是否等于集合 \(\textit{st}\) 的大小。如果相等,则说明当前前缀是一个残差前缀,答案加 \(1\)。
遍历结束后,返回答案即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。其中 \(n\) 是字符串 \(s\) 的长度。
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |