BackmediumStringsRazorpay

Recipe Book Analyzer Solution

Problem Statement

Given an uppercase English string S, determine the number of contiguous substrings that satisfy two conditions: (1) every character in the substring is either 'V' or 'N'; (2) the characters strictly alternate, meaning no two adjacent characters are identical. Substrings of length one automatically meet the alternating requirement. Return the total count of such substrings.

Example 1
Input
VNV
Output
6

Explanation: All length‑1 substrings: V, N, V → 3. Length‑2 substrings: VN and NV, both consist only of V/N and alternate → 2. Length‑3 substring: VNV also alternates → 1. Total = 3 + 2 + 1 = 6.

Example 2
Input
VVN
Output
4

Explanation: Length‑1 substrings: V, V, N → 3. Length‑2 substrings: VV (invalid, same letters) and VN (valid) → 1. Length‑3 substring VVN contains a repeated V, so it is invalid. Total = 3 + 1 = 4.

Example 3
Input
ABCVNXYZ
Output
3

Explanation: Only the segment "VN" contains allowed characters. Valid substrings are: V (position 4), N (position 5), and VN (positions 4‑5). No longer substrings qualify because they either include other letters or break the alternating rule. Total = 3.

Constraints

  • 1 <= |S| <= 200000
  • S consists only of uppercase English letters ('A'–'Z')
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

Recipe Book Analyzer — Problem Statement & Solution Guide

StringsMediumMixed
TimeO(N)
|
SpaceO(1)

Problem Description

Given an uppercase English string S, determine the number of contiguous substrings that satisfy two conditions: (1) every character in the substring is either 'V' or 'N'; (2) the characters strictly alternate, meaning no two adjacent characters are identical. Substrings of length one automatically meet the alternating requirement. Return the total count of such substrings.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Recipe Book Analyzer"

medium

WHY DOES IT MATTER?

This pattern demonstrates the power of recognizing that properties of maximal valid segments can be leveraged to count all valid subsegments in O(1) per segment, avoiding redundant checks.

OPTIMIZATION CHALLENGE

The key insight is that within a maximal alternating segment of length L, every contiguous substring is valid. Thus, instead of checking each substring, we compute the count arithmetically.

REAL-WORLD CONNECTION

Similar to counting valid sequences in network packet streams where packets must alternate between two types (e.g., request/response) without interruption, or in DNA sequence analysis where certain nucleotide patterns must alternate.

In interviews, explicitly state that you are leveraging the 'maximal segment' property. This shows you understand how to reduce O(N^2) substring enumeration to O(N) segment processing.

COMPLEXITY AT A GLANCE

⏱ Time:O(N)
💾 Space:O(1)

Core Theory — Why This Approach?

The problem reduces to counting all valid substrings within maximal contiguous segments of alternating 'V' and 'N' characters. A naive approach would iterate over all O(N^2) substrings and verify the alternating property in O(L) time, resulting in O(N^3) complexity, which is infeasible for large inputs. The key insight is that any substring of a valid alternating segment is also valid. Therefore, if we identify a maximal alternating segment of length L, the number of valid substrings within it is L * (L + 1) / 2, since every contiguous subarray of an alternating sequence is itself alternating.

Interview Questions on This Problem

Q1How would you modify this solution if the string could contain lowercase letters that should be ignored?

Filter the string to only include 'V' and 'N' (case-insensitive if needed) before processing, or treat other characters as delimiters that break the alternating sequence. The core logic remains the same: count substrings within maximal valid segments.

Q2What if the string is extremely large (10^7 characters) and memory is constrained? How do you optimize space?

Use a streaming approach: process the string character by character, maintaining only the current segment length and total count. This reduces space to O(1) while keeping time O(N).

Q3Can this problem be generalized to k alternating characters instead of 2?

Yes, but the logic changes. For k > 2, you must verify that each character differs from the previous one in a cyclic pattern. The counting formula L*(L+1)/2 no longer applies directly because not all substrings of a valid k-alternating sequence are valid. You would need a sliding window with a queue to track the last k characters.

Examples

Example 1

Input

VNV

Output

6

Explanation: All length‑1 substrings: V, N, V → 3. Length‑2 substrings: VN and NV, both consist only of V/N and alternate → 2. Length‑3 substring: VNV also alternates → 1. Total = 3 + 2 + 1 = 6.

Example 2

Input

VVN

Output

4

Explanation: Length‑1 substrings: V, V, N → 3. Length‑2 substrings: VV (invalid, same letters) and VN (valid) → 1. Length‑3 substring VVN contains a repeated V, so it is invalid. Total = 3 + 1 = 4.

Example 3

Input

ABCVNXYZ

Output

3

Explanation: Only the segment "VN" contains allowed characters. Valid substrings are: V (position 4), N (position 5), and VN (positions 4‑5). No longer substrings qualify because they either include other letters or break the alternating rule. Total = 3.

Constraints

  • 1 <= |S| <= 200000
  • S consists only of uppercase English letters ('A'–'Z')

Optimal Approach & Strategy

Traverse the string once, maintaining the length of the current maximal alternating segment of 'V' and 'N'. When the alternation breaks or the string ends, add L*(L+1)/2 to the total count, where L is the segment length, and reset the segment length.

Brute Force Approach

Iterate over all starting and ending indices to generate every possible substring. For each substring, check if it contains only 'V' and 'N' and if adjacent characters alternate, incrementing the count if valid.

Verified Code Solutions

JavaScript Solution
Time: O(N)
function main() {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        terminal: false
    });

    rl.on('line', (line) => {
        const S = line.trim();
        let count = 0;
        const n = S.length;
        for (let i = 0; i < n; i++) {
            if (S[i] !== 'V' && S[i] !== 'N') continue;
            for (let j = i; j < n; j++) {
                if (S[j] !== 'V' && S[j] !== 'N') break;
                if (j > i && S[j] === S[j-1]) break;
                count++;
            }
        }
        console.log(count);
    });

    rl.close();
}

Asked in Top Tech Interviews

Razorpay

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.