1016.Binary String With Substrings Representing 1 To N(子串能表示从 1 到 N 数字的二进制串)

Description

Given a binary string S (a string consisting only of ‘0’ and ‘1’s) and a positive integer N, return true if and only if for every integer X from 1 to N, the binary representation of X is a substring of S.


给定一个二进制字符串 S(一个仅由若干 ‘0’ 和 ‘1’ 构成的字符串)和一个正整数 N,如果对于从 1 到 N 的每个整数 X,其二进制表示都是 S 的子串,就返回 true,否则返回 false

题目链接:https://leetcode.com/problems/partition-array-into-three-parts-with-equal-sum/

Difficulty: medium

Example 1:

Input: S = "0110", N = 3
Output: true 

Example 2:

Input: S = "0110", N = 4
Output: false

Note:

  • 1 <= S.length <= 1000
  • 1 <= N <= 10^9

分析

  • 如下实现了KMP字符串匹配算法,将每个数转换成二进制的字符串表示形式;
  • 所有的结果与S比较,若全部匹配返回True;
  • 反之返回False;
  • 备注:二进制可以用bin(N)得到,匹配也可以直接用in判断,当时担心时间复杂度太高,想多了。

参考代码

class Solution(object):
def queryString(self, S, N):
    def getNext(p):
        ne=[-1]*len(p)
        j = 0
        k = -1
        while (j < len(p) - 1):
            if (k == -1 or p[k] == p[j]):
                j+=1
                k+=1
                ne[j] = k
            else:
                k = ne[k]
        return ne
    def KMP(s,p):
        ne=getNext(p)
        i=0
        j=0
        while (i < len(s) and j < len(p)):
            if (j == -1 or s[i] == p[j]):
                i+=1
                j+=1
            else:
                j = ne[j]
        if (j == len(p)):
            return True
        else:
            return False


    def getN(N):
        n=''
        while(N > 0):
            if(N%2==0):
                n='0'+n
            else:
                n='1'+n
            N//=2
        return n
    return all(KMP(S,getN(i)) for i in range(N, N / 2, -1))
-------------本文结束你这么美,还坚持读完了-------------