【GOOGLE2013校招第3道大题】
2.3 给定一个原串和目标串,只能对源串进行如下操作:
1.在给定位置插入一个字符
2.替换任意字符
3.删除任意字符
要求写一个程序,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于2000。(只需设计思路和关键步骤伪代码)
分析:其实是考察字符串相似算法中的DL算法。
1 字符串相似度算法应用
字符串相似算法用来描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。主要的算法有基于最小编辑距离(Edit Distance)的LD算法(时间复杂度为O(mn))和最长公共子序列算法(时间复杂度为O(mn))。其应用如,对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,百度知道、百度百科都用得上。如判断S1和S2相似的办法是找出他们的公共子序列S3,S3以相同的顺序在S1和S2中出现,但是不必要连续。S3越长,S1和S3就越相似。
搜索引擎中有着重要的作用,最常用的是拼写错误检查,如搜索引擎关键字查询中拼写错误的提示,可以用上述2个算法计算字符串直接的相似度。Google的拼写错误检查的原理是什么呢?Google是基于贝叶斯统计推断的方法,相关原理详情可以看下Google的研发总监Peter Norvig写的文章,以及fuanyif写的博客“贝叶斯推断及其互联网应用”,介绍用贝叶斯算法过滤垃圾邮件。关于贝叶斯算法的理论可以参考微软刘未鹏的“数学之美番外篇:平凡而又神奇的贝叶斯方法”。
2 最长公共子序列算法
问题描述
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列S,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的。
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子序列。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共子序列。
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。
用动态规划解决
2.1 描述一个最长公共子序列(描述最优解的结构)
先介绍LCS问题的性质:记Xm={x1,…xm}和Yn={y1,…,yn}为两个字符串,而Zk={z0,z1,…zk}是它们的LCS,则:
1) 如果xm=yn,那么zk=xm=yn,并且Zk-1是Xm-1和Yn-1的一个LCS;
2)如果xm≠yn,那么当zk≠xm时Zk-1是Xm-1和Y的一个LCS;
3)如果xm≠yn,那么当zk≠yn时Zk-1是Yn-1和X的一个LCS;