色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

徹底理解編輯距離問(wèn)題edit distance

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:碼農(nóng)的荒島求生 ? 2023-04-10 14:04 ? 次閱讀

給定兩個(gè)字符串word1以及word2,返回將word1轉(zhuǎn)為word2需要的最少步驟,在每一步中你可以針對(duì)字符串word1進(jìn)行以下操作:

新增一個(gè)字符

刪除一個(gè)字符

替換一個(gè)字符

假如word1是"horse",word2是“ros”,那么你的程序需要返回3,也就是說(shuō)將word1轉(zhuǎn)為word2至少需要三個(gè)步驟:

將word1中的第一個(gè)字符h替換為字符r:horse -> rorse,此時(shí)word1變?yōu)閞orse,word1與word2前兩個(gè)字符相等

將word1中的第三個(gè)字符r刪掉:rorse -> rose,此時(shí)word1變?yōu)閞ose,word1與word2的前三個(gè)字符相等

將word1中的最后一個(gè)字符刪掉:rose -> ros,此時(shí)word1與word2相等。

想一想該怎樣用動(dòng)態(tài)規(guī)劃解決這個(gè)問(wèn)題。

選擇與子問(wèn)題

和之前的題目一樣,你首先應(yīng)該找出子問(wèn)題是什么,子問(wèn)題與原始問(wèn)題的依賴(lài)關(guān)系是什么。

找出子問(wèn)題的關(guān)鍵在于每一步的選擇。

如果word1與word2的第一個(gè)字符相等,假設(shè)word1是hor、word2是hr,那么我們可以放心的排除掉兩個(gè)字符串的第一個(gè)字符,即EditDistance("hor", "hr")一定等于EditDistance("or", "r"):

4c0324f2-d75a-11ed-bfe3-dac502259ad0.png

此時(shí)我們得到了一個(gè)子問(wèn)題EditDistance("or", "r"),原始問(wèn)題EditDistance("hor", "hr")的值等于該子問(wèn)題。

真正有趣的是如果word1與word2的第一個(gè)字符不相等的情況,假設(shè)word1為“hor”,而word2為“ro”,此時(shí)根據(jù)該問(wèn)題的規(guī)則針對(duì)word1的第一個(gè)字符有三種操作:

1,在word1的第一個(gè)字符前新增(Insert)一個(gè)字符r,此時(shí)word1變?yōu)閞hor,由于此時(shí)word1 的第一個(gè)字符等于word2的第一個(gè)字符,可以放心的忽略掉,因此我們得到了子問(wèn)題EditDistance("hor","o"),由于執(zhí)行了一次新增操作,因此:

EditDistance("hor","ro")=EditDistance("hor","o")+1

2,將word1的第一個(gè)字符刪掉(Delete),此時(shí)word1變?yōu)椤皁r”,我們得到了一個(gè)新的子問(wèn)題EditDistance("or","ro"),由于執(zhí)行了一次刪除操作,因此:

EditDistance("hor","ro")=EditDistance("or","ro")+1

3,將word1的第一個(gè)字符替換(Replace )為r,此時(shí)word1變?yōu)榱恕皉or”,由于word1的第一個(gè)字符等于word2的第一個(gè)字符,因此可以放心的忽略掉,我們得到了一個(gè)新的子問(wèn)題EditDistance("or","o"),由于執(zhí)行了一次刪除操作,因此:

EditDistance("hor","ro")=EditDistance("or","o")+1

根據(jù)題目要求,我們需要得到最小的編輯距離,因此:

EditDistance("hor","ro")=min(EditDistance("hor","o"),
EditDistance("or","ro"),
EditDistance("or","o"))+1

即:

4c20a8ce-d75a-11ed-bfe3-dac502259ad0.png

可以看到,如果word1與word2的第一個(gè)字符如果不相等的話那么我們會(huì)得到三個(gè)子問(wèn)題,取這三個(gè)子問(wèn)題的最小值然后加1就是原始問(wèn)題的解。

現(xiàn)在我們找到了子問(wèn)題與原始問(wèn)題之間的依賴(lài)關(guān)系。

實(shí)際上,根據(jù)上述討論我們還可以進(jìn)一步擴(kuò)展從而得到完整的狀態(tài)空間樹(shù)。

4c3f8104-d75a-11ed-bfe3-dac502259ad0.png

從這棵樹(shù)中可以看到最小的編輯距離是2。

現(xiàn)在你應(yīng)該清楚的知道該怎樣我們是怎樣一步步將問(wèn)題不斷的分解為更小的子問(wèn)題,然后利用子問(wèn)題的解來(lái)得到原始問(wèn)題的解了。

自頂向下遞歸代碼

上圖中每個(gè)方框都是一個(gè)子問(wèn)題,決定一個(gè)子問(wèn)題的因素在于word1與word2當(dāng)前處理到了哪個(gè)位置,假設(shè)對(duì)word1處理到了第i個(gè)位置,對(duì)word2處理到了第j個(gè)位置,因此我們可以對(duì)問(wèn)題進(jìn)行定義:

intEditDistance(inti,intj);

該函數(shù)表示從i到word1的末尾形成的字符串與從j從word2的末尾形成的字符串的編輯距離。

因此如果調(diào)用該函數(shù)時(shí)我們應(yīng)該這樣使用:

EditDistance(0,0);

有了該定義與上述分析,你可以輕而易舉的寫(xiě)出這樣的遞歸代碼:

stringword1;
stringword2;

intEditDistance(inti,intj){
if(i==word1.length()&&j==word2.length())return0;
if(i==word1.length())returnword2.length()-j;
if(j==word2.length())returnword1.length()-i;

if(word1[i]==word2[j])returnEditDistance(i+1,j+1);
else{
returnmin(EditDistance(i+1,j+1),min(
EditDistance(i,j+1),
EditDistance(i+1,j)))+1;
}
}

我們將word1與word2聲明為全局變量,這樣你可以清楚的看到?jīng)Q定EditDistance函數(shù)值的因素只有這兩個(gè)參數(shù)i和j,i的取值為[0, word1.length()],j的取值為[0, word2.length()],也就是說(shuō)子問(wèn)題的個(gè)數(shù)只有(word1.length() + 1) * (word2.length() + 1) 個(gè),上述遞歸代碼存在大量重復(fù)計(jì)算問(wèn)題,因此可以通過(guò)增加cache進(jìn)行優(yōu)化,這個(gè)改動(dòng)就留給大家啦。

接下來(lái)我們著手將自頂向下的遞歸代碼改為自底向上的動(dòng)態(tài)規(guī)劃代碼。

自底向上動(dòng)態(tài)規(guī)劃代碼

由于子問(wèn)題的個(gè)數(shù)只有(word1.length() + 1) * (word2.length() + 1) 個(gè),因此可以定義一個(gè)相同大小的二維數(shù)組dp:

vector>dp(word1.length()+1,vector(word2.length()+1,0));

接下來(lái)我們要求解最小子問(wèn)題,最小子問(wèn)題就是上述遞歸代碼的遞歸出口:

if(i==word1.length()&&j==word2.length())return0;

該最小子問(wèn)題的解包含在了dp數(shù)組的初始化中。

接下來(lái)的子問(wèn)題是另外兩個(gè)遞歸出口:

if(i==word1.length())returnword2.length()-j;
if(j==word2.length())returnword1.length()-i;

我們可以簡(jiǎn)單的構(gòu)造出兩種情況下的所有i和j來(lái)初始化數(shù)組dp,即:

for(intj=word2.length()-1;j>=0;j--)
dp[word1.length()][j]=word2.length()-j;
for(inti=word1.length()-1;i>=0;i--)
dp[i][word2.length()]=word1.length()-i;

最后我們利用兩個(gè)for循環(huán)來(lái)構(gòu)造出所有的i和j,從而將遞歸函數(shù)的最后一部分:

if(word1[i]==word2[j])returnEditDistance(i+1,j+1);
else{
returnmin(EditDistance(i+1,j+1),min(
EditDistance(i,j+1),
EditDistance(i+1,j)))+1;
}

放置在for循環(huán)中,并將對(duì)遞歸函數(shù)的調(diào)用替換為對(duì)數(shù)組dp的讀寫(xiě):

for(inti=word1.length()-1;i>=0;i--){
for(intj=word2.length()-1;j>=0;j--){
if(word1[i]==word2[j])
dp[i][j]=dp[i+1][j+1];
else
dp[i][j]=min(dp[i+1][j+1],min(dp[i][j+1],dp[i+1][j]))+1;
}
}

最終,完整的動(dòng)態(tài)規(guī)劃代碼為:

intminDistance(stringword1,stringword2){
vector>dp(word1.length()+1,vector(word2.length()+1,0));
for(intj=word2.length()-1;j>=0;j--)
dp[word1.length()][j]=word2.length()-j;
for(inti=word1.length()-1;i>=0;i--)
dp[i][word2.length()]=word1.length()-i;
for(inti=word1.length()-1;i>=0;i--){
for(intj=word2.length()-1;j>=0;j--){
if(word1[i]==word2[j])
dp[i][j]=dp[i+1][j+1];
else
dp[i][j]=min(dp[i+1][j+1],min(dp[i][j+1],dp[i+1][j]))+1;
}
}

returndp[0][0];
}





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27574

原文標(biāo)題:徹底理解動(dòng)態(tài)規(guī)劃:編輯距離

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)大家有沒(méi)有軟件L-edit相關(guān)的使用教程

    請(qǐng)問(wèn)大家有沒(méi)有軟件L-edit相關(guān)的使用教程
    發(fā)表于 12-30 11:04

    字節(jié)發(fā)布SeedEdit圖像編輯模型

    近日,字節(jié)跳動(dòng)公司在其豆包大模型團(tuán)隊(duì)的官方網(wǎng)站上,正式公布了其最新的通用圖像編輯模型——SeedEdit。這款創(chuàng)新性的圖像編輯模型,為用戶(hù)提供了前所未有的便捷圖像編輯體驗(yàn)。 據(jù)官方介紹
    的頭像 發(fā)表于 11-12 10:43 ?276次閱讀

    OrCAD Capture 17.2 點(diǎn)擊edit simulation profile沒(méi)有反應(yīng)

    請(qǐng)問(wèn)OrCAD capture 17.2點(diǎn)擊edit simulation profile后沒(méi)有反應(yīng)應(yīng)該怎么解決呢,可以正常繪制原理圖,也可以跑仿真,但是沒(méi)有simulation setting窗口彈出,無(wú)法修改仿真設(shè)置,求助各位!
    發(fā)表于 09-19 22:28

    vim編輯器如何使用

    Vim編輯器是一個(gè)功能強(qiáng)大的文本編輯器,它基于Vi進(jìn)行改進(jìn),并增加了許多新特性。Vim編輯器的使用主要涉及其不同的工作模式及相應(yīng)操作。以下是Vim編輯器的基本使用方法: 一、Vim
    的頭像 發(fā)表于 08-30 14:58 ?475次閱讀

    如何理解PCB設(shè)計(jì)的爬電距離?

    一站式PCBA智造廠家今天為大家講講PCB設(shè)計(jì)爬電距離要求與走線規(guī)則有哪些?PCB設(shè)計(jì)爬電距離要求與走線規(guī)則。在PCB設(shè)計(jì)中,爬電距離和走線規(guī)則是關(guān)鍵的考慮因素,尤其是在高壓電路和高頻電路的設(shè)計(jì)中
    的頭像 發(fā)表于 08-15 09:23 ?1202次閱讀

    爬電距離是根據(jù)什么確定的

    爬電距離(Creepage Distance)是指在電氣設(shè)備中,兩個(gè)導(dǎo)體之間沿絕緣材料表面的距離。它是一個(gè)重要的電氣參數(shù),用于評(píng)估電氣設(shè)備在正常工作和故障條件下的絕緣性能。爬電距離的確
    的頭像 發(fā)表于 07-12 15:39 ?1073次閱讀

    爬電距離與電壓的對(duì)應(yīng)關(guān)系

    爬電距離(Creepage Distance)是電氣設(shè)備中的一個(gè)重要概念,它指的是在絕緣材料表面,沿著絕緣體表面或邊緣,從帶電部分到接地部分或不同電位部分之間的最短距離。爬電距離的大小
    的頭像 發(fā)表于 07-12 15:35 ?3043次閱讀

    微軟AI新成果:將不可編輯PDF轉(zhuǎn)化為可編輯文檔

    市面現(xiàn)有相關(guān)軟件雖能將PDF轉(zhuǎn)為可編輯版,但易喪失原始布局。微軟研究論文名為《從不可編輯文檔生成可編輯文檔的方法和系統(tǒng)》,其獨(dú)特之處在于運(yùn)用AI技術(shù)保持了字體、色彩、布局及圖像格式等視覺(jué)元素的完整性。
    的頭像 發(fā)表于 05-30 10:11 ?732次閱讀

    HarmonyOS開(kāi)發(fā)案例:【圖片編輯

    基于ArkTS的聲明式開(kāi)發(fā)范式的樣例,主要介紹了圖片編輯實(shí)現(xiàn)過(guò)程。
    的頭像 發(fā)表于 04-23 20:54 ?409次閱讀
    HarmonyOS開(kāi)發(fā)案例:【圖片<b class='flag-5'>編輯</b>】

    UCGUI edit輸入框內(nèi)字符串如何單獨(dú)用光標(biāo)選中某字符進(jìn)行修改?

    如題: UCGUI edit輸入框內(nèi)字符串如何單獨(dú)用光標(biāo)選中某字符進(jìn)行修改? 使用場(chǎng)景: 對(duì)RTC芯片進(jìn)行校時(shí)。GUI繪畫(huà)虛擬鍵盤(pán):edit輸入框、虛擬按鍵;用于實(shí)現(xiàn)年月子時(shí)分秒時(shí)間的輸入。 現(xiàn)在
    發(fā)表于 04-23 06:14

    tftlcd畫(huà)線程序里面xerr&gt;distance和yerr&gt;distance兩個(gè)條件能成立嗎?

    實(shí)驗(yàn)中這個(gè)程序是沒(méi)問(wèn)題的,就是在個(gè)人讀程序中,無(wú)法理解if(xerr>distance) 和if(yerr>distance) 兩個(gè)條件,個(gè)人認(rèn)為distance選取
    發(fā)表于 04-22 07:35

    使用EDIT_SetDecMode()函數(shù)設(shè)置十進(jìn)制編輯后變成了一個(gè)黑塊的原因?

    使用了EDIT_SetDecMode()函數(shù)設(shè)置十進(jìn)制編輯后,就變成這樣;但是在電腦上仿真界面的時(shí)候,數(shù)字和背景是會(huì)自動(dòng)反色的,但下載到單片機(jī)上就是一個(gè)黑色塊。請(qǐng)問(wèn)會(huì)是什么原因?
    發(fā)表于 04-12 06:12

    arcgis圖層字段怎么批量輸入屬性

    對(duì)于ArcGIS圖層字段的批量輸入屬性,可以通過(guò)以下步驟完成: 打開(kāi)ArcMap軟件,并加載需要編輯屬性的圖層。 在ArcMap的主菜單中,選擇“編輯Edit)”選項(xiàng),然后選擇“開(kāi)始編輯
    的頭像 發(fā)表于 02-25 14:15 ?5038次閱讀

    CCS edit Flags有bug

    今天發(fā)現(xiàn)編輯完Build->Edit Flags里面的內(nèi)容后會(huì)被自動(dòng)更新出錯(cuò),請(qǐng)問(wèn)這個(gè)問(wèn)題如何解決呢? 我編輯如此: -v28 -ml -mt --cla_support=cla1
    發(fā)表于 02-24 17:50

    變頻器在長(zhǎng)距離供電時(shí)末端電壓會(huì)升高還是降低?

    理解,但是有一點(diǎn),如果在電能傳輸距離很長(zhǎng)時(shí),會(huì)導(dǎo)致末端電壓的變化,我搜了百度上面的一些回答,有的說(shuō)過(guò)長(zhǎng)的傳輸距離會(huì)導(dǎo)致末端電壓升高,但是這與我平常的認(rèn)知理解不一樣,
    發(fā)表于 01-11 18:50
    主站蜘蛛池模板: 韩国精品韩国专区久久| 国产精品自拍| 国产激情精品久久久久久碰| 快插我我好湿啊公交车上做| 亚洲 日韩 在线 国产 精品| 初中XXXXXL| 欧美一区二区激情视频| 3d无遮挡h肉动漫在线播放| 久草在线新是免费视频| 亚洲精品美女久久777777| 国产午夜小视频| 我要干av| 国产传媒在线观看| 手机在线观看无码日韩视频| 东莞桑拿美女| 日本成熟bbxxxxxxxx| xxnx动漫| 日本视频久久| 俄罗斯mm| 翁用力的抽插| 国模玲玲自拍337p| 亚洲三级视频在线观看| 久久www99re在线播放| 樱桃熟了A级毛片| 美女诱点第6季| av网站视频在线观看| 日本久久久久久久做爰片日本| 大胸美女裸身色诱网站| 手机在线播放成人亚洲影院电影| 国产成人免费网站在线观看| 邪恶肉肉全彩色无遮盖| 久久国产乱子伦免费精品| 2021精品乱码多人收藏| 日本人HD18HD18| 国产强奷伦奷片| 伊人亚洲AV久久无码精品| 免费果冻传媒2021在线看| 苍老师刺激的120分钟| 小草观看免费高清视频| 久久青青无码AV亚洲黑人| MELODY在线播放无删减|