我想返回一个字符串的所有可能组合,同时保持所有内容的正确顺序并避免重复。原因是什么?我想通过允许假名和汉字的混合来更灵活地回答一些日本测验。因此,我需要所有可能的组合来与用户的答案进行比较。
这是该函数的当前语法:(located here)
Genki.getAlts('{月曜日}と{水曜日}と{金曜日}に{日本語}のクラスがあります', 'げつようび|すいようび|きんようび|にほんご');
大括号内的文本是将由第二个参数中的替代文本替换的文本,我将其简称为replacements。但是,替代文本只能替换相同的索引。那是:
给出我想要实现的目标的简单示例。说我有以下内容:
Genki.getAlts('...{A}...{B}...', '1|2', true);
我希望它返回所有组合,例如以下。
'...1...{B}...' '...1...2...' '...{A}...2...' '...{A}...{B}...'
当前实现在2-7个给定的替换下效果很好,但是当给定超过8个时,总组合覆盖率开始下降。可以使用以下公式计算组合的总数:
Math.pow(2, 8)
,它将返回“ 256”组合进行8次替换,但是目前getAlts()仅返回234个连击,这意味着我们缺少22个,只给了91个组合覆盖率百分比。
所以这就是我目前所处的位置。您可以通过下面的链接查看当前代码。 (是的,这是相当荒谬的)自学成才后,我竭尽所能获得尽可能多的连击,但我担心我的数学技能不是那么好。我敢肯定,有一个更简单的方法可以解决这个问题,而我只是想得太清楚了。
作为当前算法失败的一个示例,打开控制台,您应该看到最后一个问题的警告,类似以下内容:
234/256(9个组合的91.40625%组合覆盖率; 22个组合缺失)>
此问题的代码:
Genki.getAlts('{1:私}はきのう{学校}で{1:写真}を{1:撮}りました。{2:私}は{家}でも{2:写真}を{2:撮}りました。', 'わたし|がっこう|しゃしん|と|わたし|いえ|しゃしん|と', true);
和一个简单得多的替代品,其中有10个替代品,可以在控制台中执行测试用例:
Genki.getAlts('{A}{B}{C}{D}{E}{F}{G}{H}{I}{J}', '1|2|3|4|5|6|7|8|9|10', true)
是否有任何可能且简单的方式返回一个字符串的所有组合,而不管指定了多少个替换?虽然我确实知道有多少种组合,但是使用Math.pow(2, n)
,我不确定如何正确地将它们全部获得。
我愿意听到有关实现此目的的现有算法或框架。
PS:实际上,该算法对于2-7次替换来说效果很好,几乎没有问题达到或超过此阈值。但是,当他们这样做时,有可能用户的答案会被错误地标记为错误,因此我想避免这种情况。最简单的解决方案显然是避免打破7,但这并非总是可能的,此外,我目前实现这一目标的方法并非最佳,因此我也希望对其进行优化。
我想返回一个字符串的所有可能组合,同时保持所有内容的正确顺序并避免重复。原因是什么?我想为一些日语提供答案...
您可以使用二进制数学解决此问题。这是一种生成字符串数组的方法: