力扣刷题记录
回溯
3211. 生成不含相邻零的二进制字符串
思路
可以直接使用回溯,这个结果很像一个树,每次只有两种选择 要么是0要么是1 根据前一个已经选择的数字,我们可以确定当前数字是选择0还是1
存在三种情况:
- 当前选择的数字是1 不用管前面的
- 当前选择数字是0的时候,如果前面没有已经选择的数字,也可直接选择
- 当前选择数字是0 前面的数字必须是1 否则不能进行选择
这个过程相当于进行了一定的剪枝操作,如果存在两个连续的0是不可以的
这个时间复杂度比较难分析
代码
var res []string
func backTracing(path []string, n int){
if len(path) == n{
// 加入结果集合
res = append(res, strings.Join(path, ""))
return
}
for i := 0; i <= 1; i++{
if i == 1 || len(path) == 0 || path[len(path)-1] == "1"{
path = append(path, strconv.Itoa(i))
backTracing(path, n)
path = path[0:len(path)-1]
}
}
}
func validStrings(n int) []string {
var path []string
res = make([]string, 0)
backTracing(path, n)
return res
}
时间复杂度:O(n * 2^n)
空间复杂度:O(n)