IOS 算法(基礎(chǔ)篇) ----- 哪種連續(xù)子字符串更長

給你一個二進(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 算法合集地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容