字串編輯距離

2021-08-21 17:03:19 字數 1720 閱讀 1965

題目

給定乙個源串和目標串,能夠對源串進行如下操作: 

1.在給定位置上插入乙個字元 

2.替換任意字元 

3.刪除任意字元 

寫乙個程式,返回最小運算元,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。

思路

如果有兩個串 a = xabcdae 和 b = xfdfa,它們的第乙個字元是相同的,只要計算a[2…7] = abcdae 和 b[2…5] = fdfa的距離就可以了。但是如果兩個串的第乙個字元不相同,那麼可以進行如下的操作(lena和lenb分別是字串a和b的長度): 

(1)刪除a串的第乙個字元,然後計算a[2…lena]和b[1…lenb]的距離。 

(2)刪除b串的第乙個字元,然後計算a[1…lena]和b[2…lenb]的距離。 

(3)修改a串的第乙個字元為b串的第乙個字元,然後計算a[2…lena]和b[2…lenb]的距離。 

(4)修改b串的第乙個字元為a串的第乙個字元,然後計算a[2…lena]和b[2…lenb]的距離。 

(5)增加b串的第乙個字元到a串的第乙個字元之前,然後計算a[1…lena]和b[2…lenb]的距離。 

(6)增加a串的第乙個字元到b串的第乙個字元之前,然後計算a[2…lena]和b[1…lenb]的距離。

在這個題目中,我們並不在乎兩個字串變得相等之後的字串是什麼樣的。所以,我們可以將上面的6個步驟簡化為:

(1)一步操作之後,再將a[2…lena] 和 b[1…lenb]變成相同的字串。 

(2)一步操作之後,再將a[1…lena] 和 b[2…lenb]變成相同的字串。 

(3)一步操作之後,再將a[2…lena] 和 b[2…lenb]變成相同的字串。

這樣,很快就可以完成乙個遞迴程式:

#include using namespace std;

class solution

private:

int strdistance(string a,int starta,int enda,string b,int startb,int endb)//if

// 字串a到末尾 b未到

else

}//if

// 字串b到末尾 a未到

if(startb > endb && starta <= enda)//if

// 字串a和b均未到末尾

if(a[starta] == b[startb])//if

else//else}};

int main() //for

for(int i = 0;i <= n;++i)//for

for(int i = 1;i <= m;++i)//if

else//else

}//for

}//for

return edit[m][n];}};

int main();

char * p = src;

int index = 0;

for (int i = 0; i < destlen; i++)

while (*p != '\0')

p++;

} src[index] = '\0';

return src;

}int main(int argc, char ** argv)

編輯字串距離

題目 題意 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另 乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪 除乙個字元。例如將kitten轉化成sitting sitten k s sittin ...

字串編輯距離

題目描述 給定乙個源串和目標串,能夠對源串進行如下操作 在給定位置上插入乙個字元 替換任意字元 刪除任意字元 寫乙個程式,返回最小運算元,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。關於字串最短編輯距離的解題思路 給定相關資料的定義 mep i j 表示源字串source ...

字串編輯距離

給出兩個單詞word1和word2,寫乙個函式計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 1 插入乙個字元 2 刪除乙個字元 3 替換乙個字元 格式 輸入行輸入兩個字串 word1 和 word2,最後輸出將 word1 轉換為 word2的最少操作次數 樣例輸入 wor...