1016. 子串能表示从 1 到 N 数字的二进制串(leetcode)-------------------c++实现
题目表述
给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 ,就返回 true,否则返回 false 。
子字符串 是字符串中连续的字符序列。
样例
示例 1:
输入:s = “0110”, n = 3
输出:true
示例 2:
输入:s = “0110”, n = 4
输出:false
条件
1 <= s.length <= 1000
s[i] 不是 ‘0’ 就是 ‘1’
1 <= n <= 109
思路
暴力解法+剪枝
每次增加一位的长度扫整个字符串,通过新的字符长度来判断新增的数字最多能有多少,然后累计够了就跳出循环,增加位数
注意点
注意0是不需要统计的
ac代码
c++:
class Solution {
public:
int min(int a,int b){
return (a>b)?b:a;
}
int StringToInt(string s){
int sum=0;
for(int i=0;i<s.size();i++)
{
if(s[s.size()-i-1]=='1')
sum+=pow(2,i);
}
return sum;
}
bool queryString(string s, int n) {
int length=1,nowMax,Max=1;
unordered_set<int> member;
member.insert(0);
while(Max<=n) //last time Max
{
int need;
nowMax=min(Max*2-1,n);
need=(nowMax-(Max-1)); //The numbers need to add(this time)
Max*=2;
int addcount=0; //this time have counted;
for(int i=0;i<s.size()-length+1;i++)
{
int now=StringToInt(s.substr(i,length));
if(member.find(now)==member.end()&&now<=nowMax)//The number do not exist and not bigger than n!
{
member.insert(now);
addcount++;
}
if(addcount==need)
break;
}
if(addcount!=need)
return false;
length++;
}
return true;
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-string-with-substrings-representing-1-to-n/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。