Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用atmost 1 b和2 c生成长度等于n的所有字符串,这些字符串包含字符a、b或c_Python_Python 3.x_String_Backtracking - Fatal编程技术网

Python 使用atmost 1 b和2 c生成长度等于n的所有字符串,这些字符串包含字符a、b或c

Python 使用atmost 1 b和2 c生成长度等于n的所有字符串,这些字符串包含字符a、b或c,python,python-3.x,string,backtracking,Python,Python 3.x,String,Backtracking,生成具有以下约束的所有字符串 长度:n 允许的字符:a、b、c 最多一个b 最多两个c 我已经编写了以下代码 def generate(s,counta,countb,countc,n,result): if counta+countb+countc==n: print(counta,countb,countc) result.append(s) print(s) return if counta+countb+

生成具有以下约束的所有字符串

  • 长度:n
  • 允许的字符:a、b、c
  • 最多一个b
  • 最多两个c
我已经编写了以下代码

def generate(s,counta,countb,countc,n,result):
    if counta+countb+countc==n:
        print(counta,countb,countc)
        result.append(s)
        print(s)
        return
    if counta+countb+countc<n and counta<=n:
        generate(s+"a",counta+1,countb,countc,n,result)
    if counta+countb+countc<n and countb<=1:
        generate(s+"b",counta+1,countb+1,countc,n,result)
    if counta+countb+countc<n and countc<=2:
        generate(s+"c",counta,countb,countc+1,n,result)


result=[]
generate("",0,0,0,3,result)
print(result)
更新代码:(正在工作)


你的一些逻辑是错误的;例如,
countb您的某些逻辑已关闭;例如,
countb如果您喜欢更干净的解决方案,那么下面的代码应该可以完成这项工作。约束逻辑与生成逻辑完全分离。这样,可以独立于生成逻辑添加约束

from itertools import product

n = 3

for i in map(''.join, product('abc', repeat=n)):
    if i.count('b') <= 1 and i.count('c') <= 2:
        print(i)


如果您更喜欢更干净的解决方案,那么下面的代码应该可以完成这项工作。约束逻辑与生成逻辑完全分离。这样,可以独立于生成逻辑添加约束

from itertools import product

n = 3

for i in map(''.join, product('abc', repeat=n)):
    if i.count('b') <= 1 and i.count('c') <= 2:
        print(i)


你犯了一个小错误<代码>生成(s+“b”、计数A+1、计数b+1、计数C、n、结果)
不应添加
counta+1
。投票以打字错误结束。这就是为什么要添加2个长度的字符串,因为在该块中,由于双倍增量,计数过早地达到了3<代码>生成(s+“b”、计数A+1、计数b+1、计数C、n、结果)
不应添加
counta+1
。投票以打字错误结束。这就是为什么要添加2个长度的字符串,因为在该块中,由于双倍增量,计数过早地达到3。非常感谢您指出这些问题。现在可以用了非常感谢您指出这些问题。现在可以用了写得更短;运行速度可能慢得多。写入时间短;运行速度可能会慢得多。
['aaa', 'aab', 'aac', 'aba', 'abc', 'aca', 'acb', 'acc', 'baa', 'bac', 'bca', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbc', 'cca', 'ccb']
from itertools import product

n = 3

for i in map(''.join, product('abc', repeat=n)):
    if i.count('b') <= 1 and i.count('c') <= 2:
        print(i)

aaa
aab
aac
aba
abc
aca
acb
acc
baa
bac
bca
bcc
caa
cab
cac
cba
cbc
cca
ccb