首页 新闻 会员 周边

阿里机试题——模式匹配算法(KMP)问题

0
悬赏园豆:10 [待解决问题]

前两天参加阿里的机试,有这样一道题:

题目:给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如, query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。

思考:如果要考虑效率问题,拟打算采用类似KMP算法的思想,现在理不出思路,求大神帮忙,万分感谢啦!

苗苗彬的主页 苗苗彬 | 初学一级 | 园豆:184
提问于:2014-09-02 11:04
< >
分享
所有回答(3)
1

最简单的方案:

bool found = false;

for(int i = Min(query.length, text.length); i >= 1; i--)

{

    for(int j = 0; j <= text.length - i; j ++)

    {

        var part = text.Substring(j, i);

        if(query.indexof(part) >= 0)

        {

            Console.WriteLine("MaxLength:" + i);

            Console.WriteLine("Value:" + part);

            found = true;

            break;//也可以不跳出,可以找出所有最长的字符串,如果跳出,则只找出第一条。

        }

    }

    if(found)

    {

        break;

    }

}

 

至于KMP,未研究过。

519740105 | 园豆:5810 (大侠五级) | 2014-09-02 11:21

谢谢你的回答,好高端,赞一个。。。。俄才刚开始接触c++,完全看不懂。。。呜呜

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-09-03 10:58
1

DP,类似最长公共子序列的算法,f[i][j]表示query以i为结尾,text已j为结尾满足条件的最大值,if query[i] != text[j]

f[i][j] = 0

否则f[i][j] = f[i-1][j-1] + 1,最后遍历一遍f数组,找出最大值就行了,O(N^2)

Wiki_ki | 园豆:202 (菜鸟二级) | 2014-09-02 13:30

谢谢你的回答,。。。我在《算法导论》里就有这个,灰常感谢哈~~

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-09-03 11:03
1

两个O(n)的算法。

把两个串拼起来DC3构造后缀数组O(n),线性扫描SA求出height数组O(n),扫一遍height数组算LCS。

O(n)构造一个串的后缀自动机,用另一个串去跑这个SAM,记录每一步走到的距离,最远距离就是LCS。O(n)

cyendra | 园豆:202 (菜鸟二级) | 2014-09-02 15:23

灰常感谢哈~~

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-09-03 11:05

灰常感谢哈~~这个效率好高,目测回去学习《算法导论》。。。

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-09-03 11:09

@苗苗彬: 这个算法导论里好像没讲,最好是去看论文。

罗穗骞《后缀数组-处理字符串的有力工具》

陈立杰《NOI冬令营陈立杰讲稿》

支持(0) 反对(0) cyendra | 园豆:202 (菜鸟二级) | 2014-09-03 12:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册