[杨小白]_leetcode_761. 特殊的二进制序列

57 阅读2分钟

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

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

leetcode_761. 特殊的二进制序列

761. 特殊的二进制序列

8月8日的每日一题

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

0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。 给定一个特殊的二进制序列 S,以字符串形式表示。定义一个操作 为首先选择 S 的两个连续且非空的特殊的子串,然后将它们交换。(两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符。)

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

示例 1

输入: S = "11011000"

输出: "11100100"

解释:

将子串 "10" (在S[1]出现) 和 "1100" (在S[3]出现)进行交换。

这是在进行若干次操作后按字典序排列最大的结果。

说明:

  1. S 的长度不超过 50
  2. S 保证为一个满足上述定义的特殊 的二进制序列。
class Solution {
    public String makeLargestSpecial(String s) {
        ArrayList<String> list = new ArrayList<>();
        int count = 0;
        int pre = 0;
        int n = s.length();
        for(int i = 0; i < n; i++) {
            if(s.charAt(i)=='1') {
                count++;
            } else {
                count--;
                if(count==0) {
                    list.add("1" + makeLargestSpecial(s.substring(pre + 1,i)) +"0");
                    pre = i + 1;
                }
            }
        }
        StringBuffer sb = new StringBuffer();
        Collections.sort(list,((o1, o2) -> o2.compareTo(o1)));
        for(String ss : list) {
            sb.append(ss);
        }
        return sb.toString();
    }
}

解析

不得不说,这个题我看了半天,都没看明白他说的是干什么,直到看了别人的评论,将1看作'(',将0看作')'。这样的话示例1的输入S="11011000"就变成了S="( () ( () ) )"。

要明白以下两个重要特征

1.所谓的特俗的二进制序列,就是一个正常合理有效的括号序列,比如1100就是(())是可以的 1010就是()()是可以的,但是1001,())(肯定就是非法的了。

2.返回最大的结果,就是要1尽可能的在前面。

对于整个字符串来说 一定是1开头0结尾的,那么从第1个到第n-2个字符串中,从头开始遍历,用count记录括号的层数,一旦括号的层数为0说明是一个有效的字符串,这样就再遍历循环他内部的字符串即可。

最终讲遍历的字符串,从大到小排列,拼接,返回的就是我们所要求的字符串了。

3.结束

太菜了,,,,还是看了别人的才做出来的,前进的道路还很远啊!!!