我试图查看给定的骰子是否可以弥补给定的字符串。如果我们得到'IAM'
和
given_set= [['I', 'B', 'A'], ['J', 'I', 'P',], ['M', 'R', 'S'], ['T', 'U', 'V']]
我的代码为此返回False。但是,如果我们从第二个列表中获取'I'
并从第一个列表中获取'A'
,我们仍然可以创建该字符串。我想我除了这个之外还掩盖了大多数其他案件。
任何人都可以指导我如何解决这个特殊情况吗?
这是我的代码:
def possible(string, given_set):
a = False
if len(string) > len(given_set):
return False
if string == '':
return True
for i in string:
for index, value in enumerate(given_set):
if i in value:
a = possible(string[1:],given_set[0:index] + given_set[index+1:])
return a
else:
return False
答案 0 :(得分:0)
您需要确保不会太快返回False
,因为您仍然可以尝试其他可能性。在这里,您会看到我们只返回a
True
- 因为一旦您找到了解决方案,就无需继续寻找,您可以马上返回True
。通过递归调用将返回True
。
如果return False
中没有i
,你也有value
- 这意味着如果它不在你看的第一套中就放弃了,这也是错误的。我已经把这种情况转移到了循环之外,因为你只知道一旦你看过所有的集合就不可能了:
def possible(string, given_set):
a = False
if len(string) > len(given_set):
return False
if string == '':
return True
for i in string:
for index, value in enumerate(given_set):
if i in value:
a = possible(string[1:],given_set[0:index] + given_set[index+1:])
if a:
return a
return False
现在我相信它有效:
given_set= [['I', 'B', 'A'], ['J', 'I', 'P',], ['M', 'R', 'S'], ['T', 'U', 'V']]
# possible cases
print possible("IJM", given_set) # True
print possible("IJT", given_set) # True
print possible("IIM", given_set) # True
print possible("JMT", given_set) # True
print possible("IMA", given_set) # True
print possible("VIB", given_set) # True
print possible("VPA", given_set) # True
# impossible cases
print possible("ZZZ", given_set) # False
print possible("ABC", given_set) # False
print possible("AIJ", given_set) # False
print possible("IJB", given_set) # False
print possible("VPT", given_set) # False
print possible("JRP", given_set) # False
print possible("RAS", given_set) # False