LD(Levenshtein distance)莱文斯坦距离----编辑距离
鏈接:https://ac.nowcoder.com/acm/contest/327/G
來源:牛客網(wǎng)
G處女座與復(fù)讀機(jī)
題目描述
一天,處女座在牛客算法群里發(fā)了一句“我好強(qiáng)啊”,引起無數(shù)的復(fù)讀,可是處女座發(fā)現(xiàn)復(fù)讀之后變成了“處女座好強(qiáng)啊”。處女座經(jīng)過調(diào)查發(fā)現(xiàn)群里的復(fù)讀機(jī)都是失真的復(fù)讀機(jī),會(huì)固定的產(chǎn)生兩個(gè)錯(cuò)誤。一個(gè)錯(cuò)誤可以是下面的形式之一:
處女座現(xiàn)在在群里發(fā)了一句話,他收到了一個(gè)回應(yīng),他想知道這是不是一個(gè)復(fù)讀機(jī)。
/*
算法簡介:
萊文斯坦距離是兩個(gè)字符串序列的距離度量。形式化地說,是由一個(gè)單詞變?yōu)榱硪粋€(gè)單詞需要的最小編輯次數(shù)(編輯方式:插入,刪除,替換)。所以萊文斯坦距離也稱為編輯距離。
定義:
兩個(gè)字符串a(chǎn),b之間的萊文斯坦距離為:
如果
min(i,j) = 0;
levab(i,j) = max(i,j);
{length_a = 0 || lenth_b = 0,levab(a,b) = max(length_a,length_b);}
否則,
t = min(levab(i-1,j)+1,levab(i,j-1)+1);
levab = min( t,levab(i-1,j-1) + ( ai!= bj ) );
{
如果ai != bj,編輯數(shù)+1,否則+0;
}
為了實(shí)現(xiàn)上述定義,我們用dp[i][j]來存s1[1…i]變成s2[1…j]需要的最小編輯數(shù)
得出公式:
i = 0:
dp[i][j] = j;
j = 0:
dp[i][j] = i;
i,j都不為0:
dp[i][j] = min(min(dp[i-1][j] + 1,dp[i][j-1] + 1),dp[i-1][j-1] + (s1[i] != s2[j] ) );
公式理解:
1.
i == 0 || j==0好理解,有一個(gè)為空串,當(dāng)然最小編輯數(shù)就是非空串的長度
2.
對(duì)于i,j都非零的情況,分三種情況:
1)假設(shè)s1[1…i-1] 變換到s2[1…j]需要最小的操作數(shù)為dp[i-1][j] = k,那么對(duì)于dp[i][j] = k+1,那么s1i就多余了,只需將s1中s1i刪除
2)假設(shè)s1[1…i] 變換到s2[1…j-1]需要最小的操作數(shù)為dp[i-1][j] = k,那么對(duì)于dp[i][j] = k+1,只需在s1中s1i后插入s2j
3)假設(shè)s1[1…i-1] 變換到s2[1…j-1]需要最小的操作數(shù)為dp[i-1][j] = k,那么dp[i][j]可能需要編輯也可能不需要編輯,要看s1i 是否等于s2j,如果不相等,那就要把s1i替換成s2j,否則不需要編輯,所以dp[i][j] = k + (s1i!= s2j);
*/
ac_code:
總結(jié)
以上是生活随笔為你收集整理的LD(Levenshtein distance)莱文斯坦距离----编辑距离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1276: 求和游戏
- 下一篇: 处女座与cf(思维题)