心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

给定一个仅包含小写字母的英文单词表,其中每个单词最多包含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 阅读(411) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理