最小操作数——Google2013笔试题
2016-08-11 17:13
267 查看
题目描述:(题目链接:最小操作数)
给定一个原串和目标串,能对源串进行如下操作:
1.在给定位置插入一个字符;
2.替换任意字符 ;
3.删除任意字符。
要求完成一个函数,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于2000。
举个例子来直观理解一下这个题目:将kitten字符串转化成sitting需要经过如下三步:
sitten (k→s)
sittin (e→i)
sitting (→g)
因而最少的操作数为3。这个数称为Levenshtein距离或编辑距离,这个概念由俄罗斯科学家Vladimir
Levenshtein在1965年提出。
分析:首先定义一个函数edit(i,j),表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。经过分析可知edit(i,j)有一下递推公式:
![](https://img-blog.csdn.net/20160811164448486?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其中,当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
于是原问题转化为一个动态规划的问题。
程序清单如下:
参考资料:
编辑距离及编辑距离算法
给定一个原串和目标串,能对源串进行如下操作:
1.在给定位置插入一个字符;
2.替换任意字符 ;
3.删除任意字符。
要求完成一个函数,返回最少的操作数,使得源串进行这些操作后等于目标串。源串和目标串长度都小于2000。
举个例子来直观理解一下这个题目:将kitten字符串转化成sitting需要经过如下三步:
sitten (k→s)
sittin (e→i)
sitting (→g)
因而最少的操作数为3。这个数称为Levenshtein距离或编辑距离,这个概念由俄罗斯科学家Vladimir
Levenshtein在1965年提出。
分析:首先定义一个函数edit(i,j),表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离。经过分析可知edit(i,j)有一下递推公式:
其中,当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。
于是原问题转化为一个动态规划的问题。
程序清单如下:
#include <string> using namespace std; class Solution { public: /** * 返回从源字符串到目标字符串的最小操作数 * source: 源字符串 * target:目标字符串 * 返回:最小操作数 */ int min(int a,int b) { return (a<b)?a:b; } int minOperationCount(string source, string target) { int len1 = source.length(); int len2 = target.length(); int **res = new int*[len1+1]; for(int i = 0;i<len1+1;++i) res[i] = new int[len2+1]; for(int i = 0;i<len1+1;++i) res[i][0] = i; for(int j = 0;j<len2+1;++j) res[0][j] = j; for(int i = 1;i<len1+1;++i) { for(int j = 1;j<len2+1;++j) { int tmp = min(res[i-1][j]+1,res[i][j-1]+1); int d; if(source[i-1] == target[j-1]) d = 0 ; else d = 1 ; res[i][j] = min(tmp,res[i-1][j-1]+d); } } int result = res[len1][len2]; for(int i = 0; i < len1+1; i++) { delete[] res[i]; res[i] = NULL; } delete[] res; res = NULL; return result; } };
参考资料:
编辑距离及编辑距离算法
相关文章推荐
- google笔试题 -- 根据已知数列得到不能组合求和的最小数
- 最小括号匹配算法(2013小米笔试)
- Google 2013校招笔试题:前N个素数
- 2013 google校园招聘笔试题 (北京)
- 仔仔细细做面试题---google2013校园招聘笔试题
- 每日一道算法题:Google 2009年某笔试题:求出元素位于0到9之间的集合A中大于某个给定正整数K的组成的最小正整数。
- GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树
- 2013 google校园招聘笔试题
- Google编程题:最小操作数
- GOOGLE的一道笔试题—求给定连通无环无向图可以生成的最小高度树
- Google 2013校园招聘笔试题
- Google 2013校招笔试题:用swap排序
- google校招笔试题 最小编辑距离
- 2013 google校园招聘笔试题
- 程序设计-google2013校招笔试题
- google 2013 校园招聘笔试题
- 2013--google笔试
- Google 2013笔试题一
- 一道google笔试题以及解答
- google 笔试题: 丑数