/*
Restore IP Addresses
https://leetcode.com/problems/restore-ip-addresses/description/

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
*/

var restoreIpAddresses = function (s) {
  var restore = restoreInputBits("", s, 4);

  var ret = [];
  for (var i = 0; i < restore.length; i++) {
    ret.push(restore[i].join("."));
  }

  return ret;
};

var restoreInputBits = function (partial, s, num) {
  if (s.length == 0 && num == 0) return [partial];
  if (s.length < num || s.length > num * 3 || num == 0) return [];

  const oneNum = restoreInputBits(
    [...partial, s.slice(0, 1)],
    s.slice(1),
    num - 1
  );

  if (s.length === 1 || s.slice(0, 1) === "0") return oneNum;

  const twoNums = restoreInputBits(
    [...partial, s.slice(0, 2)],
    s.slice(2),
    num - 1
  );
  if (s.length === 2 || s.slice(0, 3) > 255) return [...oneNum, ...twoNums];

  const threeNums = restoreInputBits(
    [...partial, s.slice(0, 3)],
    s.slice(3),
    num - 1
  );
  return [...oneNum, ...twoNums, ...threeNums];
};

module.exports.restoreIpAddresses = restoreIpAddresses;