LeetCode每日一题3211---生成不含相邻零的二进制字符串

一、题目描述

给你一个正整数 n

如果一个二进制字符串 x 的所有长度为 2

子字符串

中包含 至少 一个 "1",则称 x 是一个 有效 字符串。

返回所有长度为 n 的 有效 字符串,可以以任意顺序排列。

示例 1:

输入: n = 3

输出: ["010","011","101","110","111"]

解释:

长度为 3 的有效字符串有:"010 "、"011 "、"101 "、"110 " 和 "111"。

二、解题思路

本题的目标就是找长度为n2进制数,其中不能有两个0相连

这里我才用最简单的解法 回溯法 但这道题目还有速度更快的解法,位运算

回溯法过程:

字符串的每个位置都需要填入 01。对于 0≤i<n,如果 i=0 或字符串的下标 i−1 处填入 1,则字符串的下标 i 处可以填入 01,否则字符串的下标 i 处只能填入 1

当得到一个长度为 n 的有效字符串时,我们可以判断这个字符串是否符合要求,如果符合要求则将该字符串添加到结果列表中。

三、代码

c 复制代码
class Solution {   
public:
 // 判断字符串是否符合条件
    bool check(string s){
        int size = s.size();
        for(int i=0;i<size;i++){
            if(s[i]=='0'&&s[i+1]=='0'){
                return false;
            }
        }
        return true;
    }


    vector<string> validStrings(int n) {
        vector<string> res;
        string cur = "";
        backtrack(cur,n,0,res);
        return res;       
    }
    // 回溯法  
    void backtrack(string &cur,int n,int level,vector<string> &res){
        if(level> n){
            return;
        }

        if(level == n && check(cur)){
            res.push_back(cur);
            return;
        }

        cur.push_back('0');
        level++;
        backtrack(cur,n,level,res);
        cur.pop_back();
        cur.push_back('1');
        backtrack(cur,n,level,res);
        cur.pop_back();
        level--;

    }
};
相关推荐
2601_967760785 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b5 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun6 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考6 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu7 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
爱吃苹果的日记本7 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
张小姐的猫7 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
302wanger8 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥9 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户204937554959 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法