LeetCode 题解工作台

特殊的二进制字符串

特殊的二进制字符串 是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。 给定一个特殊的二进制字符串 s 。 一次移动操作包括选择字符串 s 中的两个连续的、非空的、特殊子串,并交换它们。两个字符串是连续的,如果第一个字符串…

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

困难 · string·结合·递归

bolt

答案摘要

我们可以把特殊的二进制序列看作“有效的括号”,其中 代表左括号,而 代表右括号。例如,"11011000" 可以看作:"(()(()))"。 交换两个连续非空的特殊子串,相当于交换两个相邻的有效括号,我们可以使用递归来解决这个问题。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 string·结合·递归 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

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

给定一个特殊的二进制字符串 s

一次移动操作包括选择字符串 s 中的两个连续的、非空的、特殊子串,并交换它们。两个字符串是连续的,如果第一个字符串的最后一个字符与第二个字符串的第一个字符的索引相差正好为 1。

返回在字符串上应用任意次操作后可能得到的字典序最大的字符串。

 

示例 1:

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

示例 2:

输入:s = "10"
输出:"10"

 

提示:

  • 1 <= s.length <= 50
  • s[i] 为 '0' 或 '1'
  • s 是一个特殊的二进制字符串。
lightbulb

解题思路

方法一:递归 + 排序

我们可以把特殊的二进制序列看作“有效的括号”,其中 11 代表左括号,而 00 代表右括号。例如,"11011000" 可以看作:"(()(()))"。

交换两个连续非空的特殊子串,相当于交换两个相邻的有效括号,我们可以使用递归来解决这个问题。

我们将字符串 ss 中的每个“有效的括号”都看作一部分,递归处理,最后进行排序,得到最终答案。

时间复杂度 O(n2)O(n^2),空间复杂度 O(n)O(n)。其中 nn 是字符串 ss 的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def makeLargestSpecial(self, s: str) -> str:
        if s == '':
            return ''
        ans = []
        cnt = 0
        i = j = 0
        while i < len(s):
            cnt += 1 if s[i] == '1' else -1
            if cnt == 0:
                ans.append('1' + self.makeLargestSpecial(s[j + 1 : i]) + '0')
                j = i + 1
            i += 1
        ans.sort(reverse=True)
        return ''.join(ans)
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    The candidate should demonstrate an understanding of recursive string manipulation techniques.

  • question_mark

    Look for the candidate's ability to handle special substring identification and swapping in a recursive manner.

  • question_mark

    Assess how efficiently the candidate optimizes recursion depth and string manipulation operations.

warning

常见陷阱

外企场景
  • error

    Failing to identify the correct substrings for swapping can lead to incorrect results.

  • error

    Overcomplicating the recursion logic or failing to handle base cases can lead to unnecessary complexity.

  • error

    Not optimizing the recursion can result in excessive computation time for larger inputs.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Consider handling input strings with varying lengths and more complex special substrings.

  • arrow_right_alt

    Explore different ways to optimize recursion for larger input sizes while maintaining correct functionality.

  • arrow_right_alt

    Experiment with alternative ways to represent the special substrings to simplify the recursive approach.

help

常见问题

外企场景

特殊的二进制字符串题解:string·结合·递归 | LeetCode #761 困难