Welcome to Subscribe On Youtube
3803. Count Residue Prefixes
Description
You are given a string s consisting only of lowercase English letters.
A prefix of s is called a residue if the number of distinct characters in the prefix is equal to len(prefix) % 3.
Return the count of residue prefixes in s.
A prefix of a string is a non-empty substring that starts from the beginning of the string and extends to any point within it.
Example 1:
Input: s = "abc"
Output: 2
Explanation:
- Prefix
"a"has 1 distinct character and length modulo 3 is 1, so it is a residue. - Prefix
"ab"has 2 distinct characters and length modulo 3 is 2, so it is a residue. - Prefix
"abc"does not satisfy the condition. Thus, the answer is 2.
Example 2:
Input: s = "dd"
Output: 1
Explanation:
- Prefix
"d"has 1 distinct character and length modulo 3 is 1, so it is a residue. - Prefix
"dd"has 1 distinct character but length modulo 3 is 2, so it is not a residue. Thus, the answer is 1.
Example 3:
Input: s = "bob"
Output: 2
Explanation:
- Prefix
"b"has 1 distinct character and length modulo 3 is 1, so it is a residue. - Prefix
"bo"has 2 distinct characters and length mod 3 is 2, so it is a residue. Thus, the answer is 2.
Constraints:
1 <= s.length <= 100scontains only lowercase English letters.
Solutions
Solution 1: Hash Table
We use a hash table $\textit{st}$ to record the set of distinct characters that have appeared in the current prefix. We iterate through each character $c$ in the string $s$, add it to the set $\textit{st}$, and then check if the length of the current prefix modulo $3$ equals the size of the set $\textit{st}$. If they are equal, it means the current prefix is a residue prefix, and we increment the answer by $1$.
After the iteration, we return the answer.
The time complexity is $O(n)$ and the space complexity is $O(n)$, where $n$ is the length of the string $s$.
-
class Solution { public int residuePrefixes(String s) { Set<Character> st = new HashSet<>(); int ans = 0; for (int i = 1; i <= s.length(); i++) { char c = s.charAt(i - 1); st.add(c); if (st.size() == i % 3) { ans++; } } return ans; } } -
class Solution { public: int residuePrefixes(string s) { unordered_set<char> st; int ans = 0; for (int i = 1; i <= s.size(); i++) { char c = s[i - 1]; st.insert(c); if (st.size() == i % 3) { ans++; } } return ans; } }; -
class Solution: def residuePrefixes(self, s: str) -> int: st = set() ans = 0 for i, c in enumerate(s, 1): st.add(c) if len(st) == i % 3: ans += 1 return ans -
func residuePrefixes(s string) int { st := make(map[rune]struct{}) ans := 0 for i, c := range s { idx := i + 1 st[c] = struct{}{} if len(st) == idx%3 { ans++ } } return ans } -
function residuePrefixes(s: string): number { const st = new Set<string>(); let ans = 0; for (let i = 0; i < s.length; i++) { const c = s[i]; st.add(c); if (st.size === (i + 1) % 3) { ans++; } } return ans; }