** 题目:**
给定一个二进制字符串 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
}