首页 > 其他分享 >leetcode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

leetcode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

时间:2024-12-02 14:33:59浏览次数:8  
标签:子串 int 二进制 长度 1461 leetcode size

1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

 

法一:使用unordered_set ,通过集合数量来判断

class Solution {
public:
    bool hasAllCodes(string s, int k) {
        int size = s.size();
        int k_2kFang = pow(2,k);
        if(size - k + 1 < k_2kFang)  return false;//如果长度为k的子串数量比2^k还少,说明就算所有子串符合条件也不囊括所有的长度为k的二进制

        unordered_set<int> nums;
        int now = 0, mult = 1;
        for(int i = 0;i < k;i++){
            if(s[k-1-i] == '1')  now += mult;
            mult *= 2;
        }
        nums.insert(now);//先计算前k个字符所代表的数,放入到集合中

        for(int i = 1;i <= size - k;i++){
            if(s[i-1] == '1')  now -= k_2kFang/2;//如果将要移走的位置是1,那么就要减掉它所代表的2^(k-1)
            now *= 2;//代表二进制数整体左移。比如 0 1 1 1 (7),左移后就是 1 1 1 0 (14)
            if(s[i+k-1] == '1')  now++;  //如果新进来的数字是1,那么now增加1
            nums.insert(now);
            if(nums.size() == k_2kFang)  return true;
        }

        return nums.size() == k_2kFang;
    }
};

 

标签:子串,int,二进制,长度,1461,leetcode,size
From: https://www.cnblogs.com/uacs2024/p/18581832

相关文章

  • Leetcode:3195
    1,题目2,思路首先找到上下左右初始边就开始循环找到上下左右最终边,做面积运算就好了(其中+1是因为下标比实际位置少1)3,代码classSolution3195{publicintminimumArea(int[][]grid){intabove=0;//上intunder=0;//下intleft=0;//......
  • LeetCode题练习与总结:路径总和 Ⅲ --437
    一、题目描述给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1:输入:root=[10,5,-3,3,2,null,......
  • LeetCode题练习与总结:找到字符串中所有字母异位词--438
    一、题目描述给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"的异位词。起始索引等于6的子......
  • LeetCode【0265】粉刷房子 II
    本文目录1中文题目2Python求解2.1求解思路2.2涉及方法2.3求解示例2.4Python代码2.5复杂度分析3题目总结1中文题目假如有一排房子共有n幢,每个房子可以被粉刷成k种颜色中的一种。房子粉刷成不同颜色的花费成本也是不同的。需要粉刷所有的房子并且使其相......
  • 【LeetCode:51. N 皇后 + DFS】
    ......
  • leetcode 1456. 定长子串中元音的最大数目
    1456.定长子串中元音的最大数目法一:借助队列classSolution{public:intmaxVowels(strings,intk){intsize=s.size(),resMax=0;queue<bool>qVowel;for(inti=0;i<k;i++){if(s[i]=='a'||s[i]==......
  • 位运算求解LeetCode--2 的幂
    2的幂https://leetcode.cn/problems/power-of-two/description/思路如果一个数是2的幂,那么该数的二进制表示形式一定是最高位为1,其余位为0,且最高位的1即为该数字全部不可能有多个1的原因:若有多个1,且还是2的倍数,那这些1应该合并为更高位的1个1,而不是以多个1的形式出现,矛盾,......
  • 位运算求解LeetCode--3的幂
    3的幂https://leetcode.cn/problems/power-of-three/description/思路方法1:如果一个数是3的幂,那么在int范围内,它一定是1162261467的因数(1162261467是int范围内3的最大幂,3的19次幂),所以只需判断该数字是否是1162261467的因数即可方法2:如果并不知道int范围内3的最大幂值,可以......
  • 位运算求解LeetCode--数字范围按位与
    数字范围按位与https://leetcode.cn/problems/bitwise-and-of-numbers-range/description/思路由题目给定数据量是,约规模,可知时间复杂度O(n)是过不了的,也就是说不能使用从left到right遍历的方法来解(规模以上的O(n)就过不了)方法1:遍历n次不行,那就减少循环次数,可以让left不动......
  • 位运算求解LeetCode--颠倒二进制位
    颠倒二进制位https://leetcode.cn/problems/reverse-bits/description/思路32位太长,以8位为例,给定字符串abcdefgh,求颠倒后的字符串hgfedcba第一步-一一交换1v1badcfehg第二步-两两交换2v2dcbahgfe第三步-四四交换4v4hgfedcba完成!使用位运算第一步-1v1ab......