給你一個二進(jìn)制字符串 s 。如果字符串中由 1 組成的 最長 連續(xù)子字符串 嚴(yán)格長于 由 0 組成的 最長 連續(xù)子字符串,返回 true ;否則,返回 false 。
注意,如果字符串中不存在 0 ,此時認(rèn)為由 0 組成的最長連續(xù)子字符串的長度是 0 。字符串中不存在 1 的情況也適用此規(guī)則。
1 <= s.length <= 100
s[i] 不是 '0' 就是 '1'
例子:
輸入:s = "1101"
輸出:true
解釋:
由 1 組成的最長連續(xù)子字符串的長度是 2:"1101"
由 0 組成的最長連續(xù)子字符串的長度是 1:"1101"
由 1 組成的子字符串更長,故返回 true 。
輸入:s = "111000"
輸出:false
解釋:
由 1 組成的最長連續(xù)子字符串的長度是 3:"111000"
由 0 組成的最長連續(xù)子字符串的長度是 3:"111000"
由 1 組成的子字符串不比由 0 組成的子字符串長,故返回 false 。
輸入:s = "110100010"
輸出:false
解釋:
由 1 組成的最長連續(xù)子字符串的長度是 2:"110100010"
由 0 組成的最長連續(xù)子字符串的長度是 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"最大的連續(xù)長度
// 定義 last 為上一個字符串
// 定義 t0, t1 為當(dāng)前計數(shù)"0", "1"連續(xù)長度
var c0 = 0, c1 = 0, last = "", t0 = 0, t1 = 0
// 遍歷s
for i in s {
// 如果當(dāng)前元素為"0"
if i == "0" {
// 如果上一個為"1"
if last == "1" {
// c1取最大連續(xù)長度
c1 = max(c1, t1)
// 重置t1
t1 = 0
}
// t0 = t0 + 1
t0 += 1
// 如果當(dāng)前元素為"1"
}else if i == "1" {
// 如果上一個為"0"
if last == "0" {
// c0取最大連續(xù)長度
c0 = max(c0, t0)
// 重置t0
t0 = 0
}
// t1 = t1 + 1
t1 += 1
}
// last始終取上一個為元素
last = String(i)
}
// 最后一次連續(xù)是沒發(fā)取出的, 固需要再取一次最大
c1 = max(c1, t1)
c0 = max(c0, t0)
// 這里也可以通過拼接個字符串處理, 例如 末尾是0, 開始時多拼接個1, 進(jìn)行循環(huán)等, 方法很多
// 判斷連續(xù)1長度是否嚴(yán)格大于0
return c1 > c0
}
當(dāng)然上面代碼定義很多變量有些冗余, 可以精簡一下, 那么有
精簡版
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 算法合集地址