BackmediumStringsAccentureUber

Balanced Tree Span Evaluator 8 Solution

Problem Statement

You are tasked with analyzing a sequence of alphanumeric tokens to determine the structural integrity of a virtual binary tree representation. The input is a string s of length N, where each character represents a node identifier. A 'balanced span' is defined as the longest contiguous substring that satisfies the Subsequence Verification property: the first half of the substring must be a subsequence of the second half, and the counts of distinct characters in both halves must be identical.

Your objective is to compute the maximum length of such a balanced span within the given string. If no such substring exists (other than the empty string), return 0. Note that a substring of length 2 where both characters are identical is considered balanced because the first character is a subsequence of the second, and the character counts match. For substrings of odd length, the 'first half' is defined as the prefix of length floor(L/2) and the 'second half' is the suffix of length floor(L/2), ignoring the middle character for the subsequence check but including it in the total length calculation if the condition holds for the halves.

Given the string s, return the length of the longest balanced span. The verification must be performed efficiently to handle large input sizes.

Example 1
Input
s = "abab"
Output
4

Explanation: Consider the entire string "abab". Length L=4. First half "ab", second half "ab". "ab" is a subsequence of "ab". Distinct char counts: {a:1, b:1} for both. Condition met. Length 4 is valid. Check if any longer exists? No. Return 4.

Example 2
Input
s = "abcabc"
Output
6

Explanation: Consider the entire string "abcabc". Length L=6. First half "abc", second half "abc". "abc" is a subsequence of "abc". Distinct char counts: {a:1, b:1, c:1} for both. Condition met. Length 6 is valid. Return 6.

Example 3
Input
s = "aabbcc"
Output
2

Explanation: Check length 6: First half "aab", second half "bcc". "aab" is not a subsequence of "bcc" (no 'a' in second half). Check length 5: First half "aa" (floor(5/2)=2), second half "cc" (last 2 chars). "aa" not subsequence of "cc". Check length 4: Substrings "aabb", "abbc", "bbcc". "aabb": First "aa", Second "bb". Not subsequence. "abbc": First "ab", Second "bc". 'a' not in "bc". "bbcc": First "bb", Second "cc". Not subsequence. Check length 3: Substrings "aab", "abb", "bbc", "bcc". "aab": First "a", Second "b" (last 1 char? No, floor(3/2)=1. First half "a", second half "b"? Wait, definition: first half length floor(L/2), second half length floor(L/2). For L=3, halves are length 1. Substring "aab": First char 'a', Last char 'b'. 'a' not subsequence of 'b'. Substring "abb": First 'a', Last 'b'. No. Substring "bbc": First 'b', Last 'c'. No. Substring "bcc": First 'b', Last 'c'. No. Check length 2: Substrings "aa", "ab", "bb", "bc", "cc". "aa": First 'a', Second 'a'. 'a' is subsequence of 'a'. Counts match. Valid. Length 2. Return 2.

Example 4
Input
s = "xyzxyz"
Output
6

Explanation: Entire string "xyzxyz". Length 6. First half "xyz", second half "xyz". Subsequence check passes. Counts match. Return 6.

Constraints

  • 1 <= s.length <= 10^5
  • s consists of lowercase English letters only
  • Time limit: 2 seconds
  • Memory limit: 256 MB
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Balanced Tree Span Evaluator 8 — Problem Statement & Solution Guide

StringsMediumSubsequence Verification
TimeO(N)
|
SpaceO(N + Σ)

Problem Description

You are tasked with analyzing a sequence of alphanumeric tokens to determine the structural integrity of a virtual binary tree representation. The input is a string s of length N, where each character represents a node identifier. A 'balanced span' is defined as the longest contiguous substring that satisfies the Subsequence Verification property: the first half of the substring must be a subsequence of the second half, and the counts of distinct characters in both halves must be identical.

Your objective is to compute the maximum length of such a balanced span within the given string. If no such substring exists (other than the empty string), return 0. Note that a substring of length 2 where both characters are identical is considered balanced because the first character is a subsequence of the second, and the character counts match. For substrings of odd length, the 'first half' is defined as the prefix of length floor(L/2) and the 'second half' is the suffix of length floor(L/2), ignoring the middle character for the subsequence check but including it in the total length calculation if the condition holds for the halves.

Given the string s, return the length of the longest balanced span. The verification must be performed efficiently to handle large input sizes.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Balanced Tree Span Evaluator 8"

medium

WHY DOES IT MATTER?

The pattern teaches how to turn a seemingly quadratic subsequence verification into a linear scan by exploiting monotonicity and pre‑computed next‑position tables, a technique that appears in many string‑processing and bioinformatics problems.

OPTIMIZATION CHALLENGE

The breakthrough is recognizing that the subsequence check can be performed incrementally: when the window expands by one character on the right, you only need to attempt to match the newly added character against the unmatched portion of the left half, reusing previous match pointers.

REAL-WORLD CONNECTION

Think of a distributed log replication system where a follower must verify that a prefix of its log (left half) appears in order within the leader’s newer entries (right half). Efficiently confirming this without re‑scanning the entire log mirrors the balanced span check.

During an interview, implement the next‑occurrence table first; it simplifies the core loop and avoids off‑by‑one bugs. Then drive the sliding window from the longest possible even length downwards, breaking early when a feasible span is found.

COMPLEXITY AT A GLANCE

⏱ Time:O(N)
💾 Space:O(N + Σ)

Core Theory — Why This Approach?

The Balanced Tree Span problem reduces to finding the longest even‑length contiguous substring where the left half is a subsequence of the right half. A naive check would compare every possible substring, leading to O(N^3) time because each verification of the subsequence property itself can be O(L). The key observation is that the subsequence condition can be verified greedily: scanning the right half while trying to match characters of the left half in order. By pre‑computing next‑occurrence tables (or using two‑pointer scanning) we can test any candidate span in O(1) amortized time. The optimal paradigm therefore combines a sliding window that expands from the centre and a monotonic check that maintains the feasibility of the subsequence property, yielding an overall linear O(N) solution. This approach mirrors classic string‑matching techniques such as the “two‑pointer subsequence check” and leverages the fact that the left half’s order never changes, allowing us to reuse previous match positions when the window slides.

Interview Questions on This Problem

Q1How would you adapt the Balanced Tree Span algorithm to work with Unicode characters and variable‑width encoding?

Treat the input as an array of code points rather than bytes; build the next‑occurrence table on code points. The two‑pointer scan remains unchanged because it operates on logical characters, preserving O(N) time and O(Σ) space where Σ is the Unicode alphabet size.

Q2Can the balanced span problem be solved using a segment tree or binary indexed tree? If so, outline the approach.

Yes. Store for each position the earliest index in the suffix where a given character appears. A segment tree can answer “can the left half be matched in the right half?” by querying the maximum of these earliest indices over the left half range. This yields O(log N) per check, but the sliding‑window technique still beats it with O(N) overall.

Q3Explain how the problem changes if the subsequence condition is reversed (right half must be a subsequence of left half) and how you would modify the algorithm.

The direction of the greedy scan flips: you now scan the left half while matching characters from the right half. The same next‑occurrence table can be built for the left side, and the sliding window logic stays identical, so the overall complexity remains O(N).

Examples

Example 1

Input

s = "abab"

Output

4

Explanation: Consider the entire string "abab". Length L=4. First half "ab", second half "ab". "ab" is a subsequence of "ab". Distinct char counts: {a:1, b:1} for both. Condition met. Length 4 is valid. Check if any longer exists? No. Return 4.

Example 2

Input

s = "abcabc"

Output

6

Explanation: Consider the entire string "abcabc". Length L=6. First half "abc", second half "abc". "abc" is a subsequence of "abc". Distinct char counts: {a:1, b:1, c:1} for both. Condition met. Length 6 is valid. Return 6.

Example 3

Input

s = "aabbcc"

Output

2

Explanation: Check length 6: First half "aab", second half "bcc". "aab" is not a subsequence of "bcc" (no 'a' in second half). Check length 5: First half "aa" (floor(5/2)=2), second half "cc" (last 2 chars). "aa" not subsequence of "cc". Check length 4: Substrings "aabb", "abbc", "bbcc". "aabb": First "aa", Second "bb". Not subsequence. "abbc": First "ab", Second "bc". 'a' not in "bc". "bbcc": First "bb", Second "cc". Not subsequence. Check length 3: Substrings "aab", "abb", "bbc", "bcc". "aab": First "a", Second "b" (last 1 char? No, floor(3/2)=1. First half "a", second half "b"? Wait, definition: first half length floor(L/2), second half length floor(L/2). For L=3, halves are length 1. Substring "aab": First char 'a', Last char 'b'. 'a' not subsequence of 'b'. Substring "abb": First 'a', Last 'b'. No. Substring "bbc": First 'b', Last 'c'. No. Substring "bcc": First 'b', Last 'c'. No. Check length 2: Substrings "aa", "ab", "bb", "bc", "cc". "aa": First 'a', Second 'a'. 'a' is subsequence of 'a'. Counts match. Valid. Length 2. Return 2.

Example 4

Input

s = "xyzxyz"

Output

6

Explanation: Entire string "xyzxyz". Length 6. First half "xyz", second half "xyz". Subsequence check passes. Counts match. Return 6.

Constraints

  • 1 <= s.length <= 10^5
  • s consists of lowercase English letters only
  • Time limit: 2 seconds
  • Memory limit: 256 MB

Optimal Approach & Strategy

Pre‑compute next‑occurrence indices for each character, then use a sliding window with two‑pointer greedy matching to test feasibility in O(1) amortized time, achieving overall O(N) time.

Brute Force Approach

Check every possible even‑length substring and, for each, run a linear subsequence verification between its halves, leading to O(N^3) time in the worst case.

Verified Code Solutions

JavaScript Solution
Time: O(N)
/**
 * @param {string} s
 * @return {number}
 */
var balancedSpan = function(s) {
    const lastSeen = new Map();
    let maxLen = 0;
    
    for (let i = 0; i < s.length; i++) {
        const c = s[i];
        if (lastSeen.has(c)) {
            const prev = lastSeen.get(c);
            const len = i - prev;
            if (len > maxLen) {
                maxLen = len;
            }
        }
        lastSeen.set(c, i);
    }
    
    return maxLen;
};

// Example usage
// console.log(balancedSpan("abab"));

Asked in Top Tech Interviews

AccentureUber

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.