Welcome to Subscribe On Youtube

3499. Maximize Active Section with Trade I

Description

You are given a binary string s of length n, where:

  • '1' represents an active section.
  • '0' represents an inactive section.

You can perform at most one trade to maximize the number of active sections in s. In a trade, you:

  • Convert a contiguous block of '1's that is surrounded by '0's to all '0's.
  • Afterward, convert a contiguous block of '0's that is surrounded by '1's to all '1's.

Return the maximum number of active sections in s after making the optimal trade.

Note: Treat s as if it is augmented with a '1' at both ends, forming t = '1' + s + '1'. The augmented '1's do not contribute to the final count.

 

Example 1:

Input: s = "01"

Output: 1

Explanation:

Because there is no block of '1's surrounded by '0's, no valid trade is possible. The maximum number of active sections is 1.

Example 2:

Input: s = "0100"

Output: 4

Explanation:

  • String "0100" → Augmented to "101001".
  • Choose "0100", convert "101001""100001""111111".
  • The final string without augmentation is "1111". The maximum number of active sections is 4.

Example 3:

Input: s = "1000100"

Output: 7

Explanation:

  • String "1000100" → Augmented to "110001001".
  • Choose "000100", convert "110001001""110000001""111111111".
  • The final string without augmentation is "1111111". The maximum number of active sections is 7.

Example 4:

Input: s = "01010"

Output: 4

Explanation:

  • String "01010" → Augmented to "1010101".
  • Choose "010", convert "1010101""1000101""1111101".
  • The final string without augmentation is "11110". The maximum number of active sections is 4.

 

Constraints:

  • 1 <= n == s.length <= 105
  • s[i] is either '0' or '1'

Solutions

Solution 1: Greedy + Two Pointers

The problem is essentially equivalent to finding the number of '1' characters in the string $\textit{s}$, plus the maximum number of '0' characters in two adjacent consecutive '0' segments.

Thus, we can use two pointers to traverse the string $\textit{s}$. Use a variable $\textit{mx}$ to record the maximum number of '0' characters in two adjacent consecutive '0' segments. We also need a variable $\textit{pre}$ to record the number of '0' characters in the previous consecutive '0' segment.

Each time, we count the number of consecutive identical characters $\textit{cnt}$. If the current character is '1', add $\textit{cnt}$ to the answer. If the current character is '0', update $\textit{mx}$ as $\textit{mx} = \max(\textit{mx}, \textit{pre} + \textit{cnt})$, and update $\textit{pre}$ to $\textit{cnt}$. Finally, add $\textit{mx}$ to the answer.

Time complexity is $O(n)$, where $n$ is the length of the string $\textit{s}$. Space complexity is $O(1)$.

  • class Solution { public int maxActiveSectionsAfterTrade(String s) { int n = s.length(); int ans = 0, i = 0; int pre = Integer.MIN_VALUE, mx = 0; while (i < n) { int j = i + 1; while (j < n && s.charAt(j) == s.charAt(i)) { j++; } int cur = j - i; if (s.charAt(i) == '1') { ans += cur; } else { mx = Math.max(mx, pre + cur); pre = cur; } i = j; } ans += mx; return ans; } } 
  • class Solution { public: int maxActiveSectionsAfterTrade(std::string s) { int n = s.length(); int ans = 0, i = 0; int pre = INT_MIN, mx = 0; while (i < n) { int j = i + 1; while (j < n && s[j] == s[i]) { j++; } int cur = j - i; if (s[i] == '1') { ans += cur; } else { mx = std::max(mx, pre + cur); pre = cur; } i = j; } ans += mx; return ans; } }; 
  • class Solution: def maxActiveSectionsAfterTrade(self, s: str) -> int: n = len(s) ans = i = 0 pre, mx = -inf, 0 while i < n: j = i + 1 while j < n and s[j] == s[i]: j += 1 cur = j - i if s[i] == "1": ans += cur else: mx = max(mx, pre + cur) pre = cur i = j ans += mx return ans 
  • func maxActiveSectionsAfterTrade(s string) (ans int) { n := len(s) pre, mx := math.MinInt, 0 for i := 0; i < n; { j := i + 1 for j < n && s[j] == s[i] { j++ } cur := j - i if s[i] == '1' { ans += cur } else { mx = max(mx, pre+cur) pre = cur } i = j } ans += mx return } 
  • function maxActiveSectionsAfterTrade(s: string): number { let n = s.length; let [ans, mx] = [0, 0]; let pre = Number.MIN_SAFE_INTEGER; for (let i = 0; i < n; ) { let j = i + 1; while (j < n && s[j] === s[i]) { j++; } let cur = j - i; if (s[i] === '1') { ans += cur; } else { mx = Math.max(mx, pre + cur); pre = cur; } i = j; } ans += mx; return ans; } 

All Problems

All Solutions