给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
注意,如果字符串中不存在 0 ,此时认为由 0 组成的最长连续子字符串的长度是 0 。字符串中不存在 1 的情况也适用此规则。
1 <= s.length <= 100
s[i] 不是 '0' 就是 '1'
例子:
输入:s = "1101"
输出:true
解释:
由 1 组成的最长连续子字符串的长度是 2:"1101"
由 0 组成的最长连续子字符串的长度是 1:"1101"
由 1 组成的子字符串更长,故返回 true 。
输入:s = "111000"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 3:"111000"
由 0 组成的最长连续子字符串的长度是 3:"111000"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
输入:s = "110100010"
输出:false
解释:
由 1 组成的最长连续子字符串的长度是 2:"110100010"
由 0 组成的最长连续子字符串的长度是 3:"110100010"
由 1 组成的子字符串不比由 0 组成的子字符串长,故返回 false 。
解题思路:
1.遍历法
题意不难理解, 一次遍历即可
代码:
未翻译版
func checkZeroOnes(_ s: String) -> Bool {
var c0 = 0, c1 = 0, last = "", t0 = 0, t1 = 0
for i in s {
if i == "0" {
if last == "1" {
c1 = max(c1, t1)
t1 = 0
}
t0 += 1
}else if i == "1" {
if last == "0" {
c0 = max(c0, t0)
t0 = 0
}
t1 += 1
}
last = String(i)
}
c1 = max(c1, t1)
c0 = max(c0, t0)
return c1 > c0
}
翻译版
func checkZeroOnes(_ s: String) -> Bool {
// 定义 c0, c1 为"0", "1"最大的连续长度
// 定义 last 为上一个字符串
// 定义 t0, t1 为当前计数"0", "1"连续长度
var c0 = 0, c1 = 0, last = "", t0 = 0, t1 = 0
// 遍历s
for i in s {
// 如果当前元素为"0"
if i == "0" {
// 如果上一个为"1"
if last == "1" {
// c1取最大连续长度
c1 = max(c1, t1)
// 重置t1
t1 = 0
}
// t0 = t0 + 1
t0 += 1
// 如果当前元素为"1"
}else if i == "1" {
// 如果上一个为"0"
if last == "0" {
// c0取最大连续长度
c0 = max(c0, t0)
// 重置t0
t0 = 0
}
// t1 = t1 + 1
t1 += 1
}
// last始终取上一个为元素
last = String(i)
}
// 最后一次连续是没发取出的, 固需要再取一次最大
c1 = max(c1, t1)
c0 = max(c0, t0)
// 这里也可以通过拼接个字符串处理, 例如 末尾是0, 开始时多拼接个1, 进行循环等, 方法很多
// 判断连续1长度是否严格大于0
return c1 > c0
}
当然上面代码定义很多变量有些冗余, 可以精简一下, 那么有
精简版
func checkZeroOnes(_ s: String) -> Bool {
var c0 = 0, c1 = 0, last = "", t = 0
for i in s {
if String(i) == last {
t += 1
}else {
if last == "1" {
c1 = max(c1, t)
}else {
c0 = max(c0, t)
}
t = 1
}
last = String(i)
}
if s.last == "1" {
c1 = max(c1, t)
}else {
c0 = max(c0, t)
}
return c1 > c0
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址
网友评论