# 2272. Substring With Largest Variance
###### tags: `leetcode`
## Description
The variance of a string is defined as the largest difference between the number of occurrences of any 2 characters present in the string. Note the two characters may or may not be the same.
Given a string s consisting of lowercase English letters only, return the largest variance possible among all substrings of s.
A substring is a contiguous sequence of characters within a string.
- Example 1:
>Input: s = "aababbb"
Output: 3
>>Explanation:
All possible variances along with their respective substrings are listed below:
- Variance 0 for substrings "a", "aa", "ab", "abab", "aababb", "ba", "b", "bb", and "bbb".
- Variance 1 for substrings "aab", "aba", "abb", "aabab", "ababb", "aababbb", and "bab".
- Variance 2 for substrings "aaba", "ababbb", "abbb", and "babb".
- Variance 3 for substring "babbb".
Since the largest possible variance is 3, we return it.
- Example 2:
>Input: s = "abcde"
Output: 0
>>Explanation:
No letter occurs more than once in s, so the variance of every substring is 0.
- Constraints:
>1 <= s.length <= 104
s consists of lowercase English letters.
## Solution
- The problem can be seem as the `Kadane Algorithm`
- Because we care about the value for the maximum and minimum difference of occurrence, we only need to take care of two characters at one time
- Collect all the characters appear in the string and then do the iteration
```cpp=
unordered_set<char> sets(begin(s), end(s));
for (auto &a : sets)
{
for (auto &b : sets)
```
- For the combination, we force the character `a` appears more than character `b` because we must iterate through both `a>b` and `b>a`. Also, we need to check whether `b` already appears and setup the initial `b` for checkup
- For `a`, the value is `+1` and `b` is `-1`. Everytime when the string appears, get the value for `a` first. If it is `b`, set `haveB` to true and check whether `b` has already exceeded the occurence of `a`. In that case, we only allow one more appearance of `b` in order to avoid the final result to be `b>a`. Once the value of `a` exceeds `b`, we set `firstB` as false to let it restart again
```cpp=
for (char &c : s)
{
val += c == a;
if (c == b)
{
haveB = 1;
if (firstB && val >= 0) firstB = 0;
else if (--val < 0)
{
firstB = 1;
val = -1;
}
}
ans = max(ans, haveB ? val : 0);
}
```