给定一个仅包含小写字母的英文单词表,其中每个单词最多包含50个字母。如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了一个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。
数据保证给定的单词表中,单词互不相同,并且单词按字典顺序排列。单词数最多10000。
先给出解题报告上的思路:
用一个栈存储当前的以第i个单词结尾的最长词链,第i+1个单词加在栈的结尾(通过出栈保持栈所存储的是一个词链)。
例如:
i 栈 : i
int 栈: i int
integer 栈: i int interger
intern 栈: i int intern (interger出栈)
internet 栈: i int intern internet
可以证明,在第i个单词插入后,当前在栈中的词链就是包含第i个单词的最长词链。
这样由于每个单词进栈出栈分别一次,所以算法的复杂度是O(n)
我的思路比官方的解法稍微差了一点。遇到此类为题很容易想到用字典树,程序我没有写。最多也只有50万个结点,遍历一次即可出解,应该可以AC。
posted on 2010-01-06 20:04
lee1r 阅读(418)
评论(0) 编辑 收藏 引用 所属分类:
题目分类:数据结构