我有一个字典txt文件,其中包含超过11k的食物成分记录,由新行分隔。 目前我将整个字典映射到数组中,其中KEYS是其中的成分。
$file = file('file.txt', FILE_IGNORE_NEW_LINES );
$arr = Array();
foreach($file as $key) {
$arr[$key] = 1;
}
我收到食谱行作为输入,例如:
<2> 2支(16汤匙)无盐黄油,室温下加入2汤匙橄榄油
目前我正在做的是删除数量(2),删除测量类型(棍棒),逗号和括号内的任何内容。
我离开了:
无盐黄油室温与橄榄油混合
我需要能够尽快从绳子上取下无盐黄油和橄榄油。
我最初的想法是创建字符串的所有可能的排列,并对数组执行简单的array_key_exists/isset/==
检查以查看它是否是有效的单词。
但是一旦我进入这么大的字符串,就有太多可能的排列让我处理。
这个问题有一个优雅的解决方案吗?
我可以强制它,只是通过strpos比较字典中的每一行和配方行,但我不认为这是正确的方法。
我唯一可以提出的,但也限制了我很多,是限制返回的排列量
因此,例如,如果我有10个单词,但我只允许3个单词的组合,如果我正确地完成了数学运算,这将使我获得大约720个结果。
答案 0 :(得分:0)
如果您将单词子集的搜索结果存储为图形,其中单词的子集具有边缘,如果超集也是有效集合,则单词具有一个额外单词的超集,并且如果您存储所有额外的单词从子集节点指出的单词作为哈希表,并且子集中的单词在词组合图中从词典中最小到最大存储,然后您可以在此图上进行广度优先搜索并确定查询的最大单词数string包含,比检查所需最小长度和更大的单词的所有子集要快得多。