题目描述
特殊的二进制序列是具有以下两个性质的二进制序列:
- 0 的数量与 1 的数量相等.
- 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量.
给定一个特殊的二进制序列 S, 以字符串形式表示. 定义一个操作为 首先选择 S 的两个连续且非空的特殊的子串
, 然后将它们交换.(两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符.)
在任意次数的操作之后, 交换后的字符串按照字典序排列的最大的结果是什么?
示例 1:
输入: S = "11011000"
输出: "11100100"
解释:
将子串 "10" (在 S[1]出现) 和 "1100" (在 S[3]出现) 进行交换.
这是在进行若干次操作后按字典序排列最大的结果.
说明:
- S 的长度不超过 50.
- S 保证为一个满足上述定义的特殊的二进制序列.
思考
虽然不会做, 但是还是要稍微思考下吧.
- 特殊二进制的性质有什么用呢?
- 两个子字符串有两个特点: 连续以及也是特殊二进制, 这个怎么用呢?
- 二进制序列的首位肯定是 1, 最后一个肯定是 0
- 两个特殊的二进制子串交换之后得到的字符串也是特殊的二进制, 只要能选出来符合要求的, 肯定可以交换
- 按字典排序最大的要求就是尽可能多的 1 靠前面
- 问题来了怎么选两个连续的特殊子串呢? 题目中的长度不超过 50 的话, 我感觉可以枚举所有的连续子串?
- 如何判断交换的终点? 感觉这个是最难的! 我想是不是可以通过动态规划来做, 因为动态规划感觉不用管中间有多少种交换方式, 主要有状态转移方程, 计算交给递归就行!
- 能不能从群论的观点来看这个问题呢? 交换就是一种操作嘛!
我这脑袋瓜只能想到这儿了?
题解
本文链接地址:761. 特殊的二进制序列,英雄不问来路,转载请注明出处,谢谢。
有话想说:那就赶紧去给我留言吧。
文章评论