Back to all solutions

#1525 - Number of Good Ways to Split a String

Problem Description

You are given a string s.

A split is called good if you can split s into two non-empty strings sleft and sright where their concatenation is equal to s (i.e., sleft + sright = s) and the number of distinct letters in sleft and sright is the same.

Return the number of good splits you can make in s.

Solution

/**
 * @param {string} s
 * @return {number}
 */
var numSplits = function(s) {
  const leftDistinct = new Map();
  const rightDistinct = new Map();
  let result = 0;

  for (const char of s) {
    rightDistinct.set(char, (rightDistinct.get(char) || 0) + 1);
  }

  for (let i = 0; i < s.length - 1; i++) {
    const char = s[i];
    leftDistinct.set(char, (leftDistinct.get(char) || 0) + 1);

    if (rightDistinct.get(char) === 1) {
      rightDistinct.delete(char);
    } else {
      rightDistinct.set(char, rightDistinct.get(char) - 1);
    }

    if (leftDistinct.size === rightDistinct.size) {
      result++;
    }
  }

  return result;
};