[Swift]LeetCode761. 特殊的二进制序列 | Special Binary String

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.


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

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

给定一个特殊的二进制序列 S,以字符串形式表示。定义一个操作 为首先选择 S 的两个连续且非空的特殊的子串,然后将它们交换。(两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符。)

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

示例 1:

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

说明:

  1. S 的长度不超过 50
  2. S 保证为一个满足上述定义的特殊 的二进制序列。


Runtime: 8 ms

Memory Usage: 19.9 MB

 1 class Solution {
 2     func makeLargestSpecial(_ S: String) -> String {
 3         var cnt:Int = 0
 4         var i:Int = 0
 5         var v:[String] = [String]()
 6         var res:String = String()
 7         for j in 0..<S.count
 8         {
 9             cnt += (S[j] == "1") ? 1 : -1
10             if cnt == 0
11             {
12                 v.append("1" + makeLargestSpecial(S.subString(i + 1, j - i - 1)) + "0");
13                 i = j + 1
14             }
15         }
16         v = v.sorted(by:>)
17         for i in 0..<v.count
18         {
19             res += v[i]
20         }
21         return res
22     }
23 }
24
25 extension String {
26     //subscript函数可以检索数组中的值
27     //直接按照索引方式截取指定索引的字符
28     subscript (_ i: Int) -> Character {
29         //读取字符
30         get {return self[index(startIndex, offsetBy: i)]}
31     }
32
33     // 截取字符串:指定索引和字符数
34     // - begin: 开始截取处索引
35     // - count: 截取的字符数量
36     func subString(_ begin:Int,_ count:Int) -> String {
37         let start = self.index(self.startIndex, offsetBy: max(0, begin))
38         let end = self.index(self.startIndex, offsetBy:  min(self.count, begin + count))
39         return String(self[start..<end])
40     }
41
42 }


12ms

 1 class Solution {
 2     func makeLargestSpecial(_ S: String) -> String {
 3         if (S.count == 0) {return S}
 4         var cnt = 0, i = 0
 5         var S = Array(S)
 6         var v = [String]()
 7         var res = ""
 8         for j in 0 ..< S.count {
 9             cnt += (S[j] == "1" ? 1 : -1)
10             if cnt == 0 {
11                 if (i + 1 <= j) {
12                     let tempStr = "1" + makeLargestSpecial(String(S[i + 1 ..< j])) + "0"
13                     v.append(tempStr)
14                     i = j + 1
15                 }
16             }
17         }
18         v.sort{$0 > $1}
19         for i in 0 ..< v.count {
20             res += v[i]
21         }
22         return res
23     }
24 }


16ms

 1 class Solution {
 2     func makeLargestSpecial(_ str: String) -> String {
 3         var count = 0
 4         var i = 0
 5
 6         var strings = [String]()
 7
 8         for j in 0..<str.count {
 9             if str[j] == "1" {
10                 count += 1
11             } else {
12                 count -= 1
13             }
14
15             if count == 0 {
16                 strings.append("1\(makeLargestSpecial(str[i + 1, j]))0")
17                 i = j + 1
18             }
19         }
20
21         strings.sort { $0 > $1 }
22         return strings.joined()
23     }
24 }
25
26 extension String {
27     subscript (i: Int) -> Character {
28         return self[index(startIndex, offsetBy: i)]
29     }
30
31     subscript (start: Int, end: Int) -> String {
32         let s = self.index(self.startIndex, offsetBy: start)
33         let e = self.index(self.startIndex, offsetBy: end)
34
35         return String(self[s...e])
36     }
37 }

原文地址:https://www.cnblogs.com/strengthen/p/10532944.html

时间: 2024-10-12 20:15:37

[Swift]LeetCode761. 特殊的二进制序列 | Special Binary String的相关文章

Java8的新特性,二进制序列转十进制数字

package kata_007_二进制序列转十进制int; /** * java8 Lambda表达式转换binary序列->十进制数 */ import java.util.ArrayList; public class ShortBinaryToDecimal { public static void main(String[] args) { ArrayList<Integer> binary = new ArrayList(); binary.add(1); binary.ad

MySQL二进制日志(binary log)总结

本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 今天无意中发现了一个云栖社区举行的MySQL“第一季:挑战玄惭之 慢SQL性能优化赛”,在测试服务器上执行其测试脚本写入数据的时候报错提示如下,Multi-statement transaction required more than 'max_binlog_cache_

十进制转换为二进制序列,并输出1的个数,和序列的奇偶序列

★十进制转换为二进制序列,并输出1的个数,和序列的奇偶序列 #include<stdio.h> int main() { int m,i,x,y; char a[32];//int为4个字节长,占32个bit位 int count=0; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i < 32; i++) { if (m%2 == 1)         //统计序列中1的个数 { co

输入的数转化为二进制序列,并统计序列中1的个数

★输入的数转化为二进制序列,并统计序列中1的个数 描述:普通的模除取余后数直接除二的办法易于理解,但是对于输入的数只限于正数和零,对于负数则不适应,所以采用与后移位的方法以此来扩大数的输入范围. #include<stdio.h> int main() { int m,b,c,i; int count = 0; char a[32]; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i <

【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数

// 将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数 #include <stdio.h> // 从原数拿出最低位,放到mid中,mid左移,原数右移 int reverse(int a) { int mid = 0; int bit; int n = 31; for (; n > 0; --n) { bit = a & 1; mid |= bit; mid <<= 1; a >>= 1; } return mid; } int main

c语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列. 程序: #include<stdio.h> int main() { int i, j, num; char arr1[16]; char arr2[16]; printf("输入一个整数:"); scanf("%d", &num); for (i = 0, j = 0; i < 32; i += 2, j++) { arr1[15 - j] = (num >> 

二进制序列相关函数

1.写一个函数返回参数二进制中1的个数 #include<stdio.h> int count_one_bit(int num) { int count=0; int i=32; while(i--) { if(num&1==1) count++; num=num>>1; } return count; } int main() { int n=0; int count=0; scanf("%d",&n); count=count_one_bit

与整数二进制序列有关的编程题

1.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列 #include<stdio.h> int main() { inti,j,n,m; chara[32]={0}; printf("peleaseinput the number:"); scanf("%d",&n); for(m=0;m<32;m++) { i=(unsignedint)n%2; j=(unsignedint)n/2; n=j; a[m]=i; } pri

位运算--统计一个数的二进制序列中1的个数

给出一个十进制数,求出该数的二进制序列中1的个数.比如 15 的二进制序列是 00000000  00000000  00000000 00001111   1的个数是4. 下边将给出几种不同的解决办法: 方法一: int count_one(int num) { int count = 0; while (num) { if (num % 2 == 1) { count++; } num = num / 2; } return count; } 由于这种方法用到了模除运算,所以这个方法只能处理