特殊的二进制序列

148 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

761. 特殊的二进制序列 - 力扣(LeetCode)

特殊的二进制序列是具有以下两个性质的二进制序列:

  • 0 的数量与 1 的数量相等。
  • 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。

给定一个特殊的二进制序列 S,以字符串形式表示。定义一个_操作_ 为首先选择 S 的两个连续且非空的特殊的子串,然后将它们交换。(两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符。)

在任意次数的操作之后,交换后的字符串按照字典序排列的最大的结果是什么?

示例 1:

输入: S = "11011000"
输出: "11100100"
解释:
将子串 "10" (在S[1]出现) 和 "1100" (在S[3]出现)进行交换。
这是在进行若干次操作后按字典序排列最大的结果。

说明:

  1. S 的长度不超过 50
  2. S 保证为一个满足上述定义的_特殊_ 的二进制序列。

解题

/**
 * @param {string} s
 * @return {string}
 */
var makeLargestSpecial = function (s) {
  if (s.length <= 4) return s;
  let count = 0;
  let arr = [];
  for (let i = 0, j = 0; i < s.length; i++) {
    if (s[i] === "1") {
      count++;
    } else {
      count--;
      if (count === 0) {
        arr.push(s.slice(j, i + 1));
        j = i + 1;
      }
    }
  }
  if (arr.length === 1) {
    return `1${makeLargestSpecial(s.slice(1, s.length - 1))}0`;
  }
  for (let i = 0; i < arr.length; i++) {
    arr[i] = makeLargestSpecial(arr[i]);
  }
  arr.sort((a, b) => b.localeCompare(a));
  return arr.join("");
};