我正在开发一款游戏而且我正在努力获得一些通用功能。假设我们有一个像"puzzle game using group of words"
这样的短语,所以我从中生成了可能的子集:
"puzzle"
,"game"
,"using"
,"group"
,"of"
,"words"
并添加更多乐趣我还添加了两个连续的组单词(目前不允许包含> 2个单词的小组):"puzzle game"
,"game using"
,"using group"
,"group of"
,"of words"
所以现在主要的想法是从形成原始句子的这些子集形成所有可能的组合。请注意,在这种情况下,子集应该是一个分区。
示例:
"puzzle game", "using", "group", "of words"
"puzzle", "game", "using group", "of", "words"
...
不允许:
"puzzle game", "game using", .. (it's not a partition as "game" is repeated)
是否有任何已知的算法可以生成所有可能的组合?我认为这对于更长的短语来说会花费很多时间,所以有没有其他方法可以根据某些重量找到可能的最佳选择?
我不假装得到代码(虽然那会很棒)但是至少任何关于在哪里看的小费或想法都会非常感激!
答案 0 :(得分:3)
首先将字符串解析为单词,让单词列表为S.创建一个空的结果列表(让它为L)可能的返回值。
使用递归解决方案:设置当前解决方案(初始化为空),并在每一步 - 添加可能的下一个单词/ double。当你用完你的单词时,'current'将是一个分区,并将其添加到列表中。
伪代码:
partitions(S,L) = partitions(S,L,{})
partitions(S,L,current):
if S is empty:
L.add current
else:
first <- S.first
second <- S.second
partitions(S-{first}-{second},L,current+{first second})
partitions(s-{first},L,current+{first})
编辑:注意:此解决方案假定每个分区只有1或2个字是合法的。如果不是这种情况,那么你将不得不重复1,...,S.size()第一个单词的硬编码递归调用,而不是硬编码的递归调用。
无递归解决方案(使用Stack和List ADT):
partitions(S):
L <- empty_result_list()
stack <- empty_stack()
stack.push(pair(S,{}))
while (stack is not empty):
current <- stack.pop()
S <- current.first
soFar <- current.second
if S is empty:
L.add(soFar)
else:
stack.push(pair(S-{S.first}-{S.second},soFar+{S.first S.second})
stack.push(pair(S-{S.first},soFar+{S.first})
return L
答案 1 :(得分:3)
如果你认为每个单词之间存在一些看不见的“障碍”,那就很简单了。
例如,“使用单词组的益智游戏”变成“拼图游戏|使用|组|”。如果你有N个单词,你就有N-1个障碍。
现在,对于每个“屏障”,您可以选择屏障是向上还是向下。如果它上升,它就像一个分离器。如果没有,则认为它不存在。
示例:
“puzzle | game | using | group of | words” - &gt; “拼图”,“游戏”,“使用”,“群组”,“词汇”
“益智游戏使用| group | of | words” - &gt; “益智游戏使用”,“群组”,“of”,“词汇”
对于每个“障碍”,您可以决定它是向上还是向下,因此只有两个选择。由于你有N-1个“障碍”,你总共有2 ^(N-1)个这样的分区
编辑:Argl = /
这些小组只限于一两个字吗?
答案 2 :(得分:2)
如果你有N
个字符串(又名星星)
******
现在在它们之间放置N-1
条。只有一种方法可以做到这一点
*|*|*|*|*|*
这是一种可能性。现在在它们之间放置N-2
条。
*|*|*|*|**
*|*|*|**|*
*|*|**|*|*
*|**|*|*|*
**|*|*|*|*
等。如果用字符串替换星号,则会定义分区。要生成将x
条放在N
个星之间的所有可能方法,您只需要一种方法来生成组合。