将连接的句子拆分为单个单词

时间:2015-03-12 20:14:36

标签: algorithm

假设我有以下字符串:" loveyou",我需要编写一个算法将其拆分为:[" love"," you"] 。
我有一本包含所有可能的单词的字典..我想通过所有可能的选项并检查它们是否是单词:
" l oveyou"," lo veyou"," lov eyou","爱你" ..
这将导致O(n ^ 2)运行时..是否有更优化的算法?

public int splitSentence(String s) {
  for (int i=1; i<s.length(); i++) {
     if (isAWord(s.split(0, i) && isAWord(i, s.length()) {
          return i;
     }
  }
  return -1;
}

1 个答案:

答案 0 :(得分:0)

我认为您可以解决问题O(mn),其中m是最长字的长度,n是输入流的长度。我需要多考虑一下,但作为一个粗略的想法草图作为Knuth-Morris-Pratt的变体:

  1. 使用prefix tree/trie存储单词列表。
  2. 在Trie。中保留未结头寸的列表。
  3. 在阅读新角色之前,在树的根部创建一个新的开放位置
  4. 对于每个打开的位置,根据输入字符在树中移动它。
  5. 当你到达一片叶子时,你找到了一个单词。由于您每次都在最差m个位置移动,因此对于每个n输入字符,当字词长度较小时,您会获得O(mn)或真O(n)到输入流的长度。

    请注意,这可以在假设下工作,您希望首先拆分较短的单词。否则需要采用。