【问题标题】:Word Break time complexity分词时间复杂度
【发布时间】:2014-01-03 14:04:54
【问题描述】:

我遇到了这样的分词问题:

给定一个输入字符串和一个单词字典,对输入进行分段 将字符串转换为以空格分隔的字典单词序列 if 可能。

例如,如果输入字符串是“applepie”并且字典包含一组标准的英文单词,那么我们将返回字符串“apple pie”作为输出

现在我自己想出了一个二次时间解决方案。我遇到了各种other quadratic time solutions using DP

但是在 Quora 中,一位用户发布了 linear time solution to this problem

我无法弄清楚它是如何变成线性的。他们在时间复杂度计算中是否存在一些错误?对于这个问题,最好的最坏情况时间复杂度是多少。我在这里发布最常见的 DP 解决方案

String SegmentString(String input, Set<String> dict) {
    int len = input.length();
    for (int i = 1; i < len; i++) {
        String prefix = input.substring(0, i);
        if (dict.contains(prefix)) {
              String suffix = input.substring(i, len);
              if (dict.contains(suffix)) {
                  return prefix + " " + suffix;
              }
        }
    }
    return null;
}

【问题讨论】:

  • 如何解决歧义? expertsexchange =&gt; [expert, sex, change], [experts, exchange]
  • 线性时间解决方案仅适用于两个单词的情况。你对此有何要求?最简单的通用解决方案是生成一个包含 2^n 个项目的幂集,DP 可以使其更快到 O(n^2)。
  • 显然可以在此链接上找到另一个线性定时算法stackoverflow.com/questions/8793387/…看第二个答案

标签: string algorithm data-structures dictionary time-complexity


【解决方案1】:

linked here 的“线性”时间算法的工作原理如下:

如果字符串是sharperneedle,字典是sharp, sharper, needle

  1. 它将sharp 推送到字符串中。
  2. 然后它看到er不在字典中,但是如果我们将它与添加的最后一个单词结合起来,那么sharper存在。因此它会弹出最后一个元素并将其推入。

IMO 上述逻辑对于字符串 eaterror 和字典 eat, eater, error 失败。

这里er会从列表中弹出吃,然后推入eater。剩余的字符串ror不应被识别和丢弃。

关于您发布的代码,如 cmets 中所述,这仅适用于一个分区位置的两个单词。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多