美文网首页
IOS 算法(基础篇) ----- 哪种连续子字符串更长

IOS 算法(基础篇) ----- 哪种连续子字符串更长

作者: ShawnAlex | 来源:发表于2021-05-24 10:16 被阅读0次

    给你一个二进制字符串 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 算法合集地址

    相关文章

      网友评论

          本文标题:IOS 算法(基础篇) ----- 哪种连续子字符串更长

          本文链接:https://www.haomeiwen.com/subject/wvtxsltx.html