特殊的二进制序列是具有以下两个性质的二进制序列:
在给定一个特殊的二进制序列S时;可以对S内部的特殊子串做交换,在多次交换后返回字典顺序最大的特殊子串。
示例1:
输入: S = "11011000"
输出: "11100100"
这道题读题就需要理解很久,实际上特殊二进制序列就是,0和1组成的字符串,并且0和1的个数相等,并且从左向右数1的个数一直大于等于0的个数。这样第一个字符必然是1最后一个字符必然是0.
这道题解法:

-
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
-
- class Solution {
- public String makeLargestSpecial(String s) {
- int length = s.length();
- if (length <= 2) {
- return s;
- }
-
- int count = 0;
- int start = 0;
- List
list = new ArrayList<>(); - for (int i = 0; i < length; i++) {
-
- if (s.charAt(i) == '1') {
- ++count;
- } else {
-
- if (--count == 0) {
- // case1. 注意递归
- list.add('1' + makeLargestSpecial(s.substring(start + 1, i)) + '0');
- // case2. 注意下一次的start
- start = i + 1;
- }
- }
- }
-
- // 对数据进行倒序
- Collections.sort(list, new Comparator
() { - @Override
- public int compare(String o1, String o2) {
- return o2.compareTo(o1);
- }
- });
-
- // 重新拼接结果
- StringBuilder res = new StringBuilder(length);
- for (String l : list) {
- res.append(l);
- }
- return res.toString();
- }
-
- public static void main(String[] args) {
- Solution solution = new Solution();
- System.out.println(solution.makeLargestSpecial("11011000"));
- }
- }
这道题实际就是一个不断拆解的问题,但找到这个规律不太容易,我是查看了其他人的分析思路后才能基本理解思路。如果换一类题可能又会忘记做法,这类题只能自己再多加练习了。如果有更好的解法或者类似的题目欢迎回复,大家一起进步。