欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++編輯距離(動態(tài)規(guī)劃)

 更新時間:2022年01月26日 10:43:17   作者:sasorit?  
這篇文章主要介紹了C++編輯距離(動態(tài)規(guī)劃),編輯距離是指兩個字符串之間,由一個轉(zhuǎn)成另一個所需的最少編輯操作次數(shù),限免詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

題目描述:

給你兩個單詞 word1 和 word2,請你計(jì)算出將 word1 轉(zhuǎn)換成 word2 所使用的最少操作數(shù) 。

我們可以對一個單詞進(jìn)行如下三種操作:

  • 插入一個字符
  • 刪除一個字符
  • 替換一個字符

編輯距離:是指兩個字符串之間,由一個轉(zhuǎn)成另一個所需的最少編輯操作次數(shù)。
問題:word1到word2的編輯距離
子問題:word1前i個字符到word2前j個字符的編輯距離
假如有兩個字符串"hat"和"wtct"
每個格子表示word1前i個字符到word2前j個字符的編輯距離

i表示插入操作,d表示刪除操作,r表示替換操作。

第一行w可以由空字符串“”插入一個w得到,操作一次;wh可以由“”插入w再插入h得到,插入兩次,依次得到“”到whct的操作次數(shù)。

第一列由h變?yōu)?ldquo;”可以對h進(jìn)行一次刪除操作,由ha變?yōu)?ldquo;”可以先刪除h再刪除a,操作兩次;由hat變?yōu)?ldquo;”可以進(jìn)行三次刪除操作依次刪除三個字母。

F(1, 1)表示由h變?yōu)閣的編輯距離:

由h到w,可以先在h前面插入一個w,變?yōu)閣h,再把h刪除,操作兩次,即用F(0, 2)的狀態(tài)下再加一次刪除操作。
還可以先把h刪除,再插入一個w,操作兩次,即用F(1, 0)的狀態(tài)再加一次插入操作。
還可以把h替換成w,操作一次,可以用F(0, 0)的狀態(tài)加一次替換操作表示。
這三種操作都能將h變?yōu)閣,而我們需要的是最少的操作次數(shù),所以選擇替換。F(1,1) 就為1。

F(1, 2)表示h變?yōu)閣h的編輯距離:

由h到wh,可以先在h的前面進(jìn)行兩次插入操作插入wh,再將原來的h刪除,即可以用F(0, 2)的狀態(tài)加一次刪除操作。
還可以把h先替換成w,然后再插入h,即F(1, 1)的狀態(tài)再加一次插入操作。
還可以再h的前面直接插入w,即F(0, 1)的狀態(tài),由于字符h和wh的第二個字符相同,所以不需要再進(jìn)行替換操作,用F(0, 1)的狀態(tài)就可以表示F(1, 2)。
在這三種操作中,刪除操作是2+1為3,插入操作為1+1為2,不需要替換用F(0, 1)表示為1,。所以F(1, 2)為1。

F(2, 1)表示ha變?yōu)閣的編輯距離:

由ha變?yōu)閣,可以先將h變?yōu)閣,再把a(bǔ)刪除,即用F(1, 1)的狀態(tài)再加一次刪除操作。
還可以將ha變?yōu)?quot;",再插入w,即用F(2, 0)再加一次插入操作。
還可以將h刪除,將a替換成w,即用F(1, 0)的狀態(tài)加一次替換操作。
刪除要兩次,插入要三次,替換要兩次。
所以F(2, 1)為2。

F(2, 2)表示ha變?yōu)閣h的編輯距離:

由ha變?yōu)閣h,可以先將h變?yōu)閣h,再刪除a,即用F(1, 2)的狀態(tài)再加一次刪除操作。
還可以ha先變?yōu)閣,再插入h,即F(2, 1)的狀態(tài)再加一次插入操作。
還可以將h替換成w,再將a替換成h,即F(1, 1)的狀態(tài)再加一次替換操作。
在這一步想要進(jìn)行刪除操作需要2次(F(1, 2) + 1), 進(jìn)行插入操作需要
3次(F(2, 1 + 1)), 進(jìn)行替換操作需要2次(F(1, 1) + 1),所以F(2, 2)為2。

經(jīng)過分析可以得出狀態(tài)轉(zhuǎn)移方程:
word2的每一個子串都可由word1的子串進(jìn)行插入,刪除,替換這三種操作得到,我們需要的是操作次數(shù)最少的結(jié)果,即:
F(i, j) = min(插入,刪除,替換)
F(i, j) = min(F(i, j - 1) + 1, F(i - 1, j) + 1, F(i - 1, j - 1) + (w1[i] == w2[j] ? 0 : 1))
這里需要注意的是替換操作如果word1[i]和word2[j]相等就不需要進(jìn)行替換了。

代碼:

class Solution {
public:
? ? int minDistance(string word1, string word2) {
? ? ? ? int row = word1.size() + 1;
? ? ? ? int col = word2.size() + 1;
? ? ? ? int dp[row][col];
? ? ? ? //把第一行和第一列初始化
? ? ? ? for(int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? dp[0][j] = j;
? ? ? ? }
? ? ? ? for(int i = 0; i < row; ++i)
? ? ? ? {
? ? ? ? ? ? dp[i][0] = i;
? ? ? ? }
? ? ? ? //依次算出上圖每個格子的狀態(tài)
? ? ? ? for(int i = 1; i < row; ++i)
? ? ? ? {
? ? ? ? ? ? for(int j = 1; j < col; ++j)
? ? ? ? ? ? {
? ? ? ? ? ? ?? ?//如果兩次字符相等,不需要替換操作
? ? ? ? ? ? ?? ?//就像上圖的由h-->wh
? ? ? ? ? ? ? ? if(word1[i - 1] == word2[j - 1])
? ? ? ? ? ? ? ? ? ? dp[i][j] = dp[i - 1][j - 1];
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return dp[row - 1][col - 1];
? ? }
};

到此這篇關(guān)于C++編輯距離(動態(tài)規(guī)劃)的文章就介紹到這了,更多相關(guān)C++編輯距離(動態(tài)規(guī)劃)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++OOP對象和類的詳細(xì)講解

    C++OOP對象和類的詳細(xì)講解

    這篇文章主要介紹了C++面相對象編程中的類與對象的特性與概念,OOP面向?qū)ο笳Z言相對C語言這樣面相過程的語言來說具有類和對象以及方法這樣的特性,需要的朋友可以參考下
    2021-08-08
  • C++11 中的std::function和std::bind詳解

    C++11 中的std::function和std::bind詳解

    這篇文章主要介紹了C++ 11 std::function和std::bind,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • C++ 整型與字符串的互轉(zhuǎn)方式

    C++ 整型與字符串的互轉(zhuǎn)方式

    今天小編就為大家分享一篇C++ 整型與字符串的互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++定時器實(shí)現(xiàn)和時間輪介紹

    C++定時器實(shí)現(xiàn)和時間輪介紹

    這篇文章主要介紹了C++定時器實(shí)現(xiàn)和時間輪介紹,定時器可以由很多種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),比如最小堆、紅黑樹、跳表、甚至數(shù)組都可以,其本質(zhì)都是拿到最小時間的任務(wù),然后取出該任務(wù)并執(zhí)行,更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-09-09
  • C語言簡明講解操作符++和--的使用方法

    C語言簡明講解操作符++和--的使用方法

    ++和--運(yùn)算符分別是+=1和-=1的簡寫。設(shè)計(jì)這樣兩個運(yùn)算符的本意是?便程序員,但i++和++i使?不恰當(dāng)有時候會造成混淆,反倒令剛?cè)腴T的C程序員有點(diǎn)混亂
    2022-04-04
  • C++實(shí)現(xiàn)二分法的一些細(xì)節(jié)(常用場景)

    C++實(shí)現(xiàn)二分法的一些細(xì)節(jié)(常用場景)

    二分法算法思想首先確定有根區(qū)間,將區(qū)間二等分,通過判斷f(x)的符號,逐步將有根區(qū)間縮小,直至有根區(qū)間足夠小,便可求出滿足精度要求的近似值
    2021-07-07
  • C++中map和vector作形參時如何給定默認(rèn)參數(shù)?

    C++中map和vector作形參時如何給定默認(rèn)參數(shù)?

    今天小編就為大家分享一篇關(guān)于C++中map和vector作形參時如何給定默認(rèn)參數(shù)?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • c++先序二叉樹的構(gòu)建詳解

    c++先序二叉樹的構(gòu)建詳解

    在本篇文章里小編給大家分享了關(guān)于c++先序二叉樹的構(gòu)建的相關(guān)知識點(diǎn),需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04
  • vs2019永久配置opencv開發(fā)環(huán)境的方法步驟

    vs2019永久配置opencv開發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了vs2019永久配置opencv開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C++?qt實(shí)現(xiàn)打開關(guān)閉狀態(tài)按鈕的代碼

    C++?qt實(shí)現(xiàn)打開關(guān)閉狀態(tài)按鈕的代碼

    這篇文章主要介紹了C++?qt實(shí)現(xiàn)打開關(guān)閉狀態(tài)按鈕,用QCheckBox可以實(shí)現(xiàn),只要在選擇與未選擇的狀態(tài)設(shè)置不同的圖片即可完成,代碼簡單易懂,需要的朋友可以參考下
    2022-03-03

最新評論