3211. 生成不含相邻零的二进制字符串

Problem: 3211. 生成不含相邻零的二进制字符串


思路

使用深度优先搜索(DFS)方法进行递归构建符合条件的字符串。我们要求生成长度为 n 的二进制字符串,且其中没有相邻的 0。因此,针对每一个位置,我们可以根据当前字符结尾的情况递归地添加字符 01。这个解法通过检查是否允许当前字符是 0,并根据条件进行递归处理,避免了相邻的 0 出现。

解题过程

  1. 定义 DFS 函数:我们定义一个匿名递归函数 dfs,它会接收当前构建的字符串 current。当 current 的长度等于目标长度 n 时,表示生成了一个符合条件的字符串,直接将其加入结果列表 result

  2. 递归生成字符

    • 如果 current 是空字符串或者末尾字符不是 '0',可以在末尾添加 '0'
    • 无论结尾字符是什么,都可以添加 '1'
  3. 起始调用 DFS:从空字符串开始调用 dfs,递归生成并加入所有可能的符合条件的字符串到 result 中。

复杂度

  • 时间复杂度: (O(2^n)) ;虽然理想情况下生成 (2^n) 种组合,但排除了包含相邻 0 的组合,因此实际复杂度小于 (2^n)。
  • 空间复杂度: (O(2^n)) ;存储所有符合条件的字符串集合,同时考虑递归调用栈的深度。

Code

class Solution {
    
    
public:
    vector<string> validStrings(int n) {
    
    
        // 用于存储所有有效的二进制字符串
        vector<string> result;

        // 定义一个匿名函数 dfs,用于进行深度优先搜索
        function<void(string)> dfs = [&](string current) {
    
    
            // 如果当前字符串长度达到 n,说明生成了一个有效字符串
            if (current.size() == n) {
    
    
                result.push_back(current); // 将有效字符串添加到结果列表中
                return; // 结束当前递归
            }
            // 如果当前字符串为空或末尾不是 '0',可以添加 '0'
            if (current.empty() || current.back() != '0') {
    
    
                dfs(current + '0'); // 递归调用,添加 '0'
            }
            // 总是可以添加 '1'
            dfs(current + '1'); // 递归调用,添加 '1'
        };

        dfs(""); // 从空字符串开始进行递归
        return result; // 返回所有生成的有效字符串
    }
};

猜你喜欢

转载自blog.csdn.net/PQ781826/article/details/143322955