編輯距離演算法

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   os   2014   for   

編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。俄羅斯科學家Vladimir Levenshtein在1965年提出這個概念。

例如將kitten一字轉成sitting:

sitten (k→s)sittin (e→i)sitting (→g)

演算法思想:動態規劃經常被用來作為這個問題的解決手段。

首先需要定義這樣一個函數——edit(i, j),它表示第一個字串的長度為i的子串到第二個字串的長度為j的子串的編輯距離。

顯然可以有如下動態規劃公式:

if i == 0 且 j == 0,edit(i, j) = 0if i == 0 且 j > 0, edit(i, j) = jif i > 0  且j == 0, edit(i, j) = iif i ≥ 1  且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) }//當第一個字串的第i個字元不等於第二個字串的第j個字元時,f(i, j) = 1;否則,f(i, j) = 0。

kitten一字轉成sitting,根據公式,可以得到

當i=0:  edit(0,0)=0,edit(0,1)=1,edit(0,2)=2,edit(0,j)=j當j=0: edit(0,0)=0,edit(1,0)=1,edit(2,1)=2,edit(i,0)=i當i>>1,j>>1: edit(1,1)=min(edit(0,1)+1,edit(1,0)+1,edit(0,0)+f(1,1)) //s1[0]=s不等於s2[0]=k , f(1,1)=1;=>edit(1,1)=1

因此可以推出,kitten一字轉成sitting的編輯矩陣:

Java代碼實現如下:

package com.editDistance;public class EditDistance {    public static void main(String[] args)    {        String str1="kitten";        String str2="sitting";        int res=getEditDistance(str1,str2);        System.out.println("最小編輯距離是:"+res);    }        private static int min(int a,int b)    {        return a<b?a:b;    }        public static int getEditDistance(String str1,String str2)    {        int len1=str1.length();        int len2=str2.length();        int m[][]=new int[len1+1][len2+1];                for(int i=0;i<len1+1;i++)        {            m[i][0]=i;        }        for(int j=0;j<len2+1;j++)        {            m[0][j]=j;        }        for(int i=1;i<len1+1;i++)        {            for(int j=1;j<len2+1;j++)            {                int temp=min(m[i-1][j]+1,m[i][j-1]+1);                int d;                //注意這裡是str1.charAt(i-1),因為字串是從charAt(0)下標開始的                if(str1.charAt(i-1)==str2.charAt(j-1))                {                    d=0;                }                else                {                    d=1;                }                                m[i][j]=min(temp,m[i-1][j-1]+d);            }        }        System.out.println("編輯矩陣是:");        System.out.println("****************");        for(int i=0;i<len1+1;i++)        {            for(int j=0;j<len2+1;j++)            {                System.out.print(m[i][j]+" ");            }            System.out.println();        }        System.out.println("****************");                return m[len1][len2];    }    }
View Code

運行結果:

 http://zh.wikipedia.org/wiki/%E7%B7%A8%E8%BC%AF%E8%B7%9D%E9%9B%A2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.