当我看到一个问题,询问是否可以从字符串中找到最长的单词时,我已经开始处理一些算法问题了(字符串没有空格只是字符)。思考了一段时间之后,我只想确认是否可以使用动态编程来解决类似于最大连续和问题的问题。在解析每个字符后,我可以调用isWord方法(已经实现),然后如果它继续下一个字符并增加字长,如果不是,那么只需将计数器重置为零并开始从该索引中查找单词。请告诉我这是否是一个好方法,否则请指导我解决这个问题的更好方法。
感谢您的帮助。
-Vik
答案 0 :(得分:2)
此算法无法正常运行。请考虑以下字符串:
BENDOCRINE
如果你从字符串的开头开始并向前扫描,但仍然有一个单词,你会发现单词“BEND”,然后在该点之后重置字符串并从O中取出。这里的正确答案是相反,选择“ENDOCRINE”这个词更长。
如果您有一个静态字典,并希望找到该字典中包含在文本字符串中的最长单词,您可能需要查看 Aho-Corasick algorithm ,它会找到文本字符串中一组字符串的每一个匹配,并且非常有效。您可以轻松地修改算法,以便它随时跟踪它输出的最长字,这样它就不会输出比目前为止发现的最长字符串更短的字符串,在这种情况下运行时将为O(n + m),其中n是要搜索的文本字符串的长度,m是所有法律英语单词中的字符总数。此外,如果您事先进行O(m)预处理,从那时起您可以在时间O(n)中找到给定字符串中最长的单词,其中n是字符串中的字符数。
(至于为什么它在时间上运行O(n + m):通常运行时是O(n + m + z),其中z是匹配数。如果你限制输出的匹配数,那么你从来没有输出比最长的字短的字,最多可输出n个字。因此运行时为O(n + m + n)= O(n + m))。
希望这有帮助!
答案 1 :(得分:0)
动态编程不适用于您的问题:
让seq1和seq2为2个字符序列
isWord(Concatenation(seq1,seq2))不能从isWord(seq1)和isWord(seq2)
的值中输入