Algorithm 最有效的单词分割算法?

Algorithm 最有效的单词分割算法?,algorithm,pseudocode,Algorithm,Pseudocode,我一直在寻找一种有效的单词分割算法,但没有太大的成功。例如,给定单词hello,我想获得该单词的所有可能分区:{h,e,l,l,o},{h,e,l,lo},{h,e,llo},{hello}。我发现的每件事都在谈论分词,这不是我的意思 提前谢谢你 该问题是NP完全问题,需要通过回溯来解决 在每个级别上,您都可以决定这个角色是属于当前分区还是应该转到新分区。以递归方式执行此操作,每次到达单词末尾时,就有一个分区。您展示了一些示例,我们可以集中讨论逗号。 要么有逗号,要么没有 Word

我一直在寻找一种有效的单词分割算法,但没有太大的成功。例如,给定单词hello,我想获得该单词的所有可能分区:{h,e,l,l,o},{h,e,l,lo},{h,e,llo},{hello}。我发现的每件事都在谈论分词,这不是我的意思


提前谢谢你

该问题是NP完全问题,需要通过回溯来解决


在每个级别上,您都可以决定这个角色是属于当前分区还是应该转到新分区。以递归方式执行此操作,每次到达单词末尾时,就有一个分区。

您展示了一些示例,我们可以集中讨论逗号。 要么有逗号,要么没有

 Word        Commas
{h,e,l,l,o}  1111
{h,e,l,l o}  1110
{h,e,l l o}  1100
...
{h e l l o}  0000
所以很明显,在4个位置上,可能有逗号,也可能没有,相互独立。您需要4位来编码分区,这是2^4种可能性,我猜是16

因此,您可以形成一个循环:

for (int i = 0; i < 15; ++i)
    bitsplit ("hello", i);
for(int i=0;i<15;++i)
比特斯普利特(“你好”,我);

在迭代i的二进制表示位的同时,遍历单词。例如,对于11,设置了位:8+2+1=1011。这意味着{h,el,l,o}。

最有可能你想要构造一个后缀trie。

我不这么认为。您可以定义所有解决方案的枚举,并将其转换为如上所示。您所提到的将具有相同的复杂性:)。但这是真的,你的方法更好。这不是NP完全的。你可能的意思是,输入的大小需要指数时间,这是可以理解的,因为输出的大小在输入的大小上也是指数的。@Martin:是的,这就是我真正想要的。也许,我混淆了NP完全的定义。为了简化很多,NP是一类决策问题,如果你神奇地得到一个解决方案,它需要多项式时间来验证这个解决方案是否有效。NP-hard是NP中需要指数时间才能实际解决的一类问题。NP完全是一类问题,每一个NP难问题都可以在多项式时间内简化为。非常感谢!事情似乎比我们预期的要简单:)我让它运行了;)