假设我有以下字符串:" 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;
}
答案 0 :(得分:0)
我认为您可以解决问题O(mn)
,其中m
是最长字的长度,n
是输入流的长度。我需要多考虑一下,但作为一个粗略的想法草图作为Knuth-Morris-Pratt的变体:
当你到达一片叶子时,你找到了一个单词。由于您每次都在最差m
个位置移动,因此对于每个n
输入字符,当字词长度较小时,您会获得O(mn)
或真O(n)
到输入流的长度。
请注意,这可以在假设下工作,您希望首先拆分较短的单词。否则需要采用。