1016. 子串能表示从 1 到 N 数字的二进制串

154 阅读1分钟

** 题目:**
给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s子字符串 ,就返回 true,否则返回 false

子字符串 是字符串中连续的字符序列。

** 算法:**
方法一:暴力

import "strings"
func queryString(s string, n int) bool {

    for i := 1; i <= n ; i ++ {
        str := fmt.Sprintf("%b", i)
        if !strings.Contains(s, str) {
            return false
        }
    }
    return true
}

方法二:暴力+优化
二进制的特性[k,k + 1,k + 2..2n]的二进制子串包含了[k / 2, k + 1/ 2, k + 2/2...n]的子串,所以只考虑[k,k + 1,k + 2..2n]就可以了。 考虑边界条件,n=1的时候,n/2=0,所以从n/2 + 1开始

import "strings"
func queryString(s string, n int) bool {

    for i := n / 2 + 1; i <= n ; i ++ {
        str := fmt.Sprintf("%b", i)
        if !strings.Contains(s, str) {
            return false
        }
    }
    return true
}