作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址: https://leetcode.com/problems/special-binary-string/description/

题目描述:

Special binary strings are binary strings with the following two properties:

  • The number of 0’s is equal to the number of 1’s.
  • Every prefix of the binary string has at least as many 1’s as 0’s.

Given a special string S, a move consists of choosing two consecutive, non-empty, special substrings of S, and swapping them. (Two strings are consecutive if the last character of the first string is exactly one index before the first character of the second string.)

At the end of any number of moves, what is the lexicographically largest resulting string possible?

Example 1:

Input: S = "11011000"
Output: "11100100"
Explanation:
The strings "10" [occuring at S[1]] and "1100" [at S[3]] are swapped.
This is the lexicographically largest string possible after some number of swaps.

Note:

  1. S has length at most 50.
  2. S is guaranteed to be a special binary string as defined above.

题目大意

一个特殊的二进制字符串满足以下两个属性:

  1. 字符串中0的个数等于1的个数
  2. 这个字符串中任何前缀中1的个数不少于0的个数

给了一个满足要求的特殊字符串,每次移动可以选择两个两个连续的非空的特殊二进制子串进行交换。求在一系列移动之后,能得到的字母顺序的字符串最大结果。

解题方法

这道题的原型是括号匹配问题。求括号匹配的经典的方法是使用cnt记数的方法,如果是左括号,那么cnt+1,如果是右括号,那么cnt-1,如果cnt等于0了,说明这已经是个匹配了的括号了。注意,一个括号匹配问题中可能存在多个匹配的括号,这个题也是,比如1010就是满足题意的二进制字符串,相等于两个满足题意的二进制串组成。

如果要想在一系列移动之后,得到最大的字符串,那么可以看出要求1尽量在前面,同时0尽量在后面。我们使用list保存那些符合要求的字符串,最后排序即可。一个符合要求的字符串其开头必须是1,末尾必须是0。同时我们意识到,符合要求的字符串的内部也要进行排序。比如子串1010,要给他排序成1100这个样子,注意中间的字符串01并不符合题目要求,给他重新排成10样式,使用递归结构。使用i保存上一次判断完成的字符串的结尾,用j遍历字符串。每次判断结束一个符合要求的子串之后,要令 i = j + 1。

最坏情况下的时间复杂度是O(N!),最优情况下的时间复杂度是O(1),空间复杂度是O(N)。

class Solution(object):
def makeLargestSpecial(self, S):
"""
:type S: str
:rtype: str
"""
cnt = 0
res = list()
i= 0
for j, v in enumerate(S):
cnt += 1 if v == "1" else -1
if cnt == 0:
res.append("1" + self.makeLargestSpecial(S[i + 1:j]) + "0")
i = j + 1
return "".join(sorted(res, reverse=True))

参考资料:

http://www.cnblogs.com/grandyang/p/8606024.html
https://blog.csdn.net/u014688145/article/details/78996824
https://blog.csdn.net/BambooYH/article/details/80686074
http://www.cnblogs.com/zzuli2sjy/p/8260854.html

日期

2018 年 10 月 2 日 —— 小蓝单车莫名其妙收了我1块钱,明明每个月免费骑10次的啊!

【LeetCode】761. Special Binary String 解题报告(Python)的更多相关文章

  1. leetcode 761. Special Binary String

    761. Special Binary String 题意: 一个符合以下两个要求的二进制串: \(1.串中包含的1和0的个数是相等的.\) \(2.二进制串的所有前缀中1的个数不少于0的个数\) 被 ...

  2. 【LeetCode】481. Magical String 解题报告(Python)

    [LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...

  3. 761. Special Binary String

    Special binary strings are binary strings with the following two properties: The number of 0's is eq ...

  4. 【LeetCode】401. Binary Watch 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 java解法 Python解法 日期 [LeetCo ...

  5. 【LeetCode】87. Scramble String 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 动态规划 日期 题目地址:https://le ...

  6. 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  7. 【LeetCode】796. Rotate String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode】767. Reorganize String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.me/ 题目地址:https://leetcode.com/problems/reorganiz ...

  9. 【LeetCode】344. Reverse String 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 新构建字符串 原地翻转 日期 题目地址:https://lee ...

随机推荐

  1. quota

    一.什么是磁盘配额 磁盘配额从字面意思上看就是给一个磁盘配置多少额度,而quota就是有多少限额的意思,所以总的来说就是限制用户对磁盘空间的使用量.因为Linux是多用户多任务的操作系统,许多人公用磁 ...

  2. 通过mac地址确认二层交换机某个端口下接的终端设备IP

    正常来说,二层交换机主要是通过mac地址进行通信的,这就导致我们无法直接通过arp表来确认交换机端口下终端设备的IP: 但我们仍然能通过查找二层交换机端口下学习到的mac地址,然后通过对照三层核心交换 ...

  3. UE4之Slate: App启动与最外层Runtime结构

    UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...

  4. 17. yum

    https://www.linuxidc.com/Linux/2015-04/116331.htm

  5. 零基础学习java------day6----数组

    0. 内容概览 补充:main方法中的数组 1. 数组的概述 概念: 用来存储一组相同数据类型的集合(或者叫容器) 注意事项: 1. 数组中的元素类型必须一致 2. 数组本身是引用数据类型,但是里面的 ...

  6. 前端页面存放token

    //本地缓存,记录token function set(type, value) { localStorage.setItem(type, value); } function get(type) { ...

  7. 从源码看RequestMappingHandlerMapping的注册与发现

    1.问题的产生 日常开发中,大多数的API层中@Controller注解和@RequestMapping注解都会被使用在其中,但是为什么标注了@Controller和@RequestMapping注解 ...

  8. Can references refer to invalid location in C++?

    在C++中,引用比指针更加的安全,一方面是因为引用咋定义时必须进行初始化,另一方面是引用一旦被初始化就无法使其与其他对象相关联. 但是,在使用引用的地方仍然会有一些例外. (1)Reference t ...

  9. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  10. shell脚本 mysql-binlog分析

    一.简介 介绍 分析binlog工具,现有功能: 基于业务表分析统计各个表的dml的次数. 各个业务表的最后访问时间. 各dml总的次数. 该binlog的事务总数. 基于业务表的binlog to ...