由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问个字符串距离的问题
相关主题
一个面试问题Linkedin 电面 面经x2
急问F家面试一题面试题分享:把数字翻译成字符串
再问个简单的C问题问下Linkedin的一道电面
求助 字符串交叉生成的问题返回字符串所有的 combination
n个点,找出离原点最近的100个点问一个经典题目
一道google 经典题菜鸟求救 请大家看看我的代码有没有问题
一道题what's the output
G 家电面题目, 欢迎讨论!问一道C++编程题
相关话题的讨论汇总
话题: srcbegin话题: dstbegin话题: dst话题: srcend话题: dstend
进入JobHunting版参与讨论
1 (共1页)
s********g
发帖数: 29
1
就是那个经典的比较两个字符串距离的问题,看两个字符串需要多少步变换才能成为相
同的字符串。我用递归写的,可是死活不对。谁给指点一下问题在哪儿?
这是我的C# code:
public int CalcDistance(string src, int srcBegin, int srcEnd, string
dst, int dstBegin, int dstEnd)
{
if (srcBegin > srcEnd)
{
if (dstBegin > dstEnd)
return 0;
else
return dstEnd - dstBegin + 1;
}
if (dstBegin > dstEnd)
{
if (srcBegin > srcEnd)
return 0;
else
return srcEnd - srcBegin + 1;
}
if (src[srcBegin] == dst[dstBegin])
return CalcDistance(src, srcBegin + 1, srcEnd, dst, dstBegin
+ 1, dstEnd);
else
{
int dist1 = CalcDistance(src, srcBegin + 1, srcEnd, dst,
dstBegin + 2, dstEnd);
int dist2 = CalcDistance(src, srcBegin + 2, srcEnd, dst,
dstBegin + 1, dstEnd);
int dist3 = CalcDistance(src, srcBegin + 2, srcEnd, dst,
dstBegin + 2, dstEnd);
return MinOfThree(dist1, dist2, dist3) + 1;
}
调用的时候:
static void Main(string[] args)
{
StringDistance std = new StringDistance();
string src = "source";
string dst = "destination";
int dist = std.CalcDistance(src, 0, src.Length-1, dst, 0, dst.
Length-1);
Console.WriteLine("Distance between {0} and {1} is {2}", src,
dst, dist);
Console.ReadKey();
}
结果我死活打印出来的distance是6,而不是10。肯定是前面递归的某个地方错了,但
是我debug进去半天也没figureout。
p*****2
发帖数: 21240
2
能不能说说思路?
这题难道不应该用DP吗?
z*********8
发帖数: 2070
3
是啊, 画个大matrix, 代码十行就够了吧

【在 p*****2 的大作中提到】
: 能不能说说思路?
: 这题难道不应该用DP吗?

s********g
发帖数: 29
4
基本的思想是这样的:
1)如果src和dst+1相等,那么distance就是1
2)如果src+1和dst相等,那么distance就是1
3)如果src+1和dst+1相等,那么distance也是1
这样就可以反复递归了...

【在 p*****2 的大作中提到】
: 能不能说说思路?
: 这题难道不应该用DP吗?

p*****2
发帖数: 21240
5

这几个逻辑怎么来的?
1相当于b+1?
2相当于a+1?
3相当于什么?

【在 s********g 的大作中提到】
: 基本的思想是这样的:
: 1)如果src和dst+1相等,那么distance就是1
: 2)如果src+1和dst相等,那么distance就是1
: 3)如果src+1和dst+1相等,那么distance也是1
: 这样就可以反复递归了...

r*****e
发帖数: 792
6
the problem in your code should be corrected as:
(1,0) (0,1) (1,1) instead of (1,2)(2,1), (2,2)
you cannot jump 2 chars when the 0's chars don't match.

string

【在 s********g 的大作中提到】
: 就是那个经典的比较两个字符串距离的问题,看两个字符串需要多少步变换才能成为相
: 同的字符串。我用递归写的,可是死活不对。谁给指点一下问题在哪儿?
: 这是我的C# code:
: public int CalcDistance(string src, int srcBegin, int srcEnd, string
: dst, int dstBegin, int dstEnd)
: {
: if (srcBegin > srcEnd)
: {
: if (dstBegin > dstEnd)
: return 0;

t*********7
发帖数: 255
7
就是找最大公共字串吧...反正不论加减修改都算一次...
y****n
发帖数: 743
8
能把原题原文贴出来吗?
p*****2
发帖数: 21240
9

edit distance.
就是两个字符串a,b。
从a变到b需要最小的步骤
每步可以做三种操作
1. 增加一个字符
2. 删除一个字符
3. 修改一个字符

【在 y****n 的大作中提到】
: 能把原题原文贴出来吗?
b******t
发帖数: 965
10
en
wikipedia上有解答

【在 p*****2 的大作中提到】
:
: edit distance.
: 就是两个字符串a,b。
: 从a变到b需要最小的步骤
: 每步可以做三种操作
: 1. 增加一个字符
: 2. 删除一个字符
: 3. 修改一个字符

l*******s
发帖数: 1258
11
请google: edit distance
这个是DP的经典问题,思路挺NB的,非常具有扩展性。相关算法在NLP领域用的很多。
基本思路就是用两个字符串构建一个matrix,每个cell代表对应的两个字串的edit
distance。
自己定义insert、delete、alternate的cost,然后比较每个cell周围三个cell的值,
确定当前值,然后就ok了
1 (共1页)
进入JobHunting版参与讨论
相关主题
问一道C++编程题n个点,找出离原点最近的100个点
面试题目: 有2个字符串,消除第一个字符串中第二个字符串包含的所有字母。 例如: string1: helloworld string2: abcdef output: hlloworld 面一道google 经典题
请教一个字符串比较排序的问题 (转载)一道题
写程序时的一个小问题?G 家电面题目, 欢迎讨论!
一个面试问题Linkedin 电面 面经x2
急问F家面试一题面试题分享:把数字翻译成字符串
再问个简单的C问题问下Linkedin的一道电面
求助 字符串交叉生成的问题返回字符串所有的 combination
相关话题的讨论汇总
话题: srcbegin话题: dstbegin话题: dst话题: srcend话题: dstend