这个问题是对问题“已知两个字符串s和t,对s在任意位置执行三种操作:插入一个字符;删除一个字符;替换一个字符,求将s变成t所需要的最少操作次数x”的延伸,其实就是多加一步公式1-x/max(len(s),len(t)),因为将字符串s变成字符串t需要变化的次数越多,那么两个字符串之间的距离就越大。
那么如何求字符串s变成字符串t的次数呢,假设len(s)=m,len(t)=n,建立一个[m,n]的二维表来记录变化次数,以abd和adfg为例,
首先初始化,表格如下,
i | a | b | d | |
---|---|---|---|---|
j | 0 | 1 | 2 | 3 |
a | 1 | |||
d | 2 | |||
f | 3 | |||
g | 4 |
然后,如果比较的两字符相等,则每一个i对应位置需要移动的次数是(i-1, j-1),(i, j-1),(i-1, j)中最小值,否则为最小值+1,更新i中第一列,如下
i | a | b | d | |
---|---|---|---|---|
j | 0 | 1 | 2 | 3 |
a | 1 | 0 | ||
d | 2 | 0+1 | ||
f | 3 | 1+1 | ||
g | 4 | 2+1 |
逐列更新后得:
i | a | b | d | |
---|---|---|---|---|
j | 0 | 1 | 2 | 3 |
a | 1 | 0 | 1 | 2 |
d | 2 | 1 | 1 | 1 |
f | 3 | 2 | 2 | 2 |
g | 4 | 3 | 3 | 3 |
最后输出[m,n]对应位置的值3。
验证,要使s变为t需要1删除b,2添加f,3添加g共3步,一致。
故abd和adfg之间的距离为1-3/4 = 1/4.