【算法】检查二进制字符串字段

99 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

题目

给你一个二进制字符串 s ,该字符串 不含前导零 。 如果 s 包含 零个或一个由连续的 '1' 组成的字段 ,返回 true 。否则,返回 false 。 如果 s 中 由连续若干个 '1' 组成的字段 数量不超过 1,返回 true 。否则,返回 false 。

解题思路

关键要点:字符串首个字符肯定是1;需要保证连续性,连续出现1的字段只能是一个。

常规解法

常规解法并是遍历整个字符串,默认情况下oneMore是true满足要求。

  1. 当出现01交替的时候直接返回false
  2. 当出现10交替zero标记置为true
  3. 当出现11时判断zero是否为true,是则直接返回false
    public boolean checkOnesSegment(String s) {
        // 第一个数务必是1
        if(s.length() <= 1) return true;
        boolean oneMore = true;
        boolean zero = false;
        for(int i = 1; i < s.length();i++){
            char text = s.charAt(i); // 遍历
            if(text == '1' && s.charAt(i - 1) == text){ // 连续1
               oneMore = true;
               if(zero) return false;
            }else if(text == '1' && s.charAt(i - 1) != text){ // 前一个不是1
                return false;
            }else { // 1 0 交替的时候
                zero = true;
            }
        }
        return oneMore;
    }

但拎清楚思路后发现上述很多判断是多余的,重新调整优化代码如下:

    public boolean checkOnesSegment(String s) {
        // 第一个数务必是1
        if(s.length() <= 1) return true;
        boolean zero = false;
        for(int i = 1; i < s.length();i++){
            char text = s.charAt(i); // 遍历
            if(text == '1' && s.charAt(i - 1) != text){ // 前一个不是1
                return false;
            }
        }
        return true;
    }

事实上只需要判断1前面是否有0即可,因为有前提条件第一个数是1了。

高效解法

根据题意理解可以清楚知道满足条件:

  1. 前置数是1
  2. 连续若干个 '1' 组成的字段 数量不超过 1
  3. 只需要判断字符串中是否存在01即可
    public boolean checkOnesSegment(String s) {
        return !s.contains("01");
    }

从解题思路来说运用高级语言可以快速使用快捷方式证明和达到目的。两者解法思想一致只是使用解题方式略有不同。

参考