Redian新闻
>
问个字符串距离的问题
avatar
问个字符串距离的问题# JobHunting - 待字闺中
s*g
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。
avatar
p*2
2
能不能说说思路?
这题难道不应该用DP吗?
avatar
z*8
3
是啊, 画个大matrix, 代码十行就够了吧

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

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

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

avatar
p*2
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
: 这样就可以反复递归了...

avatar
r*e
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;

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

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

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

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

avatar
l*s
11
请google: edit distance
这个是DP的经典问题,思路挺NB的,非常具有扩展性。相关算法在NLP领域用的很多。
基本思路就是用两个字符串构建一个matrix,每个cell代表对应的两个字串的edit
distance。
自己定义insert、delete、alternate的cost,然后比较每个cell周围三个cell的值,
确定当前值,然后就ok了
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。