精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

徹底理解動態規劃:編輯距離

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

大家好,我是小風哥。

這是動態規劃主題的第三篇,本篇的題目非常經典,幾乎是面試必備,即,編輯距離問題,edit distance;

給定兩個字符串word1以及word2,返回將word1轉為word2需要的最少步驟,在每一步中你可以針對字符串word1進行以下操作:

  • 新增一個字符
  • 刪除一個字符
  • 替換一個字符

假如word1是"horse",word2是“ros”,那么你的程序需要返回3,也就是說將word1轉為word2至少需要三個步驟:

  1. 將word1中的第一個字符h替換為字符r:horse -> rorse,此時word1變為rorse,word1與word2前兩個字符相等
  2. 將word1中的第三個字符r刪掉:rorse -> rose,此時word1變為rose,word1與word2的前三個字符相等
  3. 將word1中的最后一個字符刪掉:rose -> ros,此時word1與word2相等。

想一想該怎樣用動態規劃解決這個問題。

選擇與子問題

和之前的題目一樣,你首先應該找出子問題是什么,子問題與原始問題的依賴關系是什么。

找出子問題的關鍵在于每一步的選擇。

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

圖片

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

真正有趣的是如果word1與word2的第一個字符不相等的情況,假設word1為“hor”,而word2為“ro”,此時根據該問題的規則針對word1的第一個字符有三種操作:

1,在word1的第一個字符前新增(Insert)一個字符r,此時word1變為rhor,由于此時word1 的第一個字符等于word2的第一個字符,可以放心的忽略掉,因此我們得到了子問題EditDistance("hor","o"),由于執行了一次新增操作,因此:

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

2,將word1的第一個字符刪掉(Delete),此時word1變為“or”,我們得到了一個新的子問題EditDistance("or","ro"),由于執行了一次刪除操作,因此:

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

3,將word1的第一個字符替換(Replace )為r,此時word1變為了“ror”,由于word1的第一個字符等于word2的第一個字符,因此可以放心的忽略掉,我們得到了一個新的子問題EditDistance("or","o"),由于執行了一次刪除操作,因此:

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

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

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

即:

圖片

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

現在我們找到了子問題與原始問題之間的依賴關系。

實際上,根據上述討論我們還可以進一步擴展從而得到完整的狀態空間樹。

圖片

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

現在你應該清楚的知道該怎樣我們是怎樣一步步將問題不斷的分解為更小的子問題,然后利用子問題的解來得到原始問題的解了。

自頂向下遞歸代碼

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

int EditDistance(int i, int j);

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

因此如果調用該函數時我們應該這樣使用:

EditDistance(0, 0);

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

string word1;
string word2;

int EditDistance(int i, int j) {
if (i == word1.length() && j == word2.length()) return 0;
if (i == word1.length()) return word2.length() - j;
if (j == word2.length()) return word1.length() - i;

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

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

接下來我們著手將自頂向下的遞歸代碼改為自底向上的動態規劃代碼。


自底向上動態規劃代碼

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

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

接下來我們要求解最小子問題,最小子問題就是上述遞歸代碼的遞歸出口:

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

該最小子問題的解包含在了dp數組的初始化中。

接下來的子問題是另外兩個遞歸出口:

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

我們可以簡單的構造出兩種情況下的所有i和j來初始化數組dp,即:

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

最后我們利用兩個for循環來構造出所有的i和j,從而將遞歸函數的最后一部分:

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

放置在for循環中,并將對遞歸函數的調用替換為對數組dp的讀寫:

for (int i = word1.length() - 1; i >= 0; i--) {
for (int j = 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;
}
}

最終,完整的動態規劃代碼為:

int minDistance(string word1, string word2) {
vector<vector<int>>dp(word1.length() + 1, vector<int>(word2.length() + 1, 0));
for (int j = word2.length() - 1; j >= 0; j--)
dp[word1.length()][j] = word2.length() - j;
for (int i = word1.length() - 1; i >= 0; i--)
dp[i][word2.length()] = word1.length() - i;
for (int i = word1.length() - 1; i >= 0; i--) {
for (int j = 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;
}
}

return dp[0][0];
}


責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2022-12-29 08:12:51

動態規劃profit

2022-12-11 10:37:15

動態規劃字符串超序列

2021-09-06 06:31:40

理解動態規劃

2025-02-13 09:06:27

2021-05-13 08:55:33

Android架構功能

2020-03-03 14:15:49

Redis持久化數據庫

2019-06-11 14:45:25

2019-01-09 08:31:07

2019-11-07 10:37:36

CookieSessionToken

2025-08-28 07:58:18

2024-03-15 08:23:26

異步編程函數

2022-10-24 08:08:27

閉包編譯器

2021-12-27 09:33:12

內存泄漏程序

2023-12-28 10:39:57

數組節點數據結構

2019-12-10 13:55:10

Go指針存儲

2021-10-15 09:53:12

工具

2022-08-16 09:03:01

JavaScript前端

2024-06-21 08:32:24

2022-01-06 14:25:24

C語言指針內存

2023-09-07 08:15:58

場景同步異步
點贊
收藏

51CTO技術棧公眾號

最近中文字幕在线观看| 波多野结衣免费观看| 亚洲视频tv| 国产精品麻豆久久| 欧美一级xxx| 欧美极品欧美精品欧美| 国产精品麻豆一区二区三区 | 日韩一区二区福利| 台湾佬美性中文| 一区二区三区短视频| 国产精品传媒在线| 美女主播视频一区| 国产手机视频在线| 日韩在线a电影| 欧美日韩xxxxx| 人妻aⅴ无码一区二区三区| 欧美久久一区二区三区| 色婷婷综合久久久中文一区二区| 香蕉精品视频在线| 日本一卡二卡四卡精品| 国产精品一区免费在线观看| 国产经典一区二区| 国产亚洲色婷婷久久99精品| 成人综合一区| 日韩国产一区三区| 一个人看的视频www| 日韩制服一区| 黑人极品videos精品欧美裸| 国产手机视频在线观看| yw在线观看| 久久亚洲精品国产精品紫薇 | 亚洲精品进入| 欧美不卡一区二区三区| 依人在线免费视频| 经典三级一区二区| 欧美日韩亚洲激情| 草草视频在线免费观看| 中中文字幕av在线| 亚洲欧美综合色| 天堂资源在线亚洲视频| 亚洲av片在线观看| 99精品视频一区二区三区| 99在线视频播放| 国产精品久久影视| 久久99在线观看| 国产精自产拍久久久久久| 丁香社区五月天| 久久精品人人做人人爽电影蜜月| 性日韩欧美在线视频| 国产亚洲欧美久久久久| 国内揄拍国内精品久久| 欧美国产日韩在线| 精品视频一区二区在线观看| 欧美精品入口| 欧美激情视频一区二区三区不卡| 青青草免费av| 欧美高清日韩| 欧美极品少妇与黑人| 久久久久噜噜噜亚洲熟女综合| 欧美jizzhd精品欧美巨大免费| 欧美成人激情视频免费观看| 欧美丰满艳妇bbwbbw| 中文字幕日韩欧美精品高清在线| 久久久久99精品久久久久| 日韩精品一区二区亚洲av性色| 欧美丰满日韩| 麻豆国产精品va在线观看不卡| 无码黑人精品一区二区| 欧美久久一级| 97婷婷涩涩精品一区| 国产又粗又爽视频| 日本成人在线电影网| 国产在线观看精品| 国产99视频在线| 北条麻妃一区二区三区| 久久综合九色综合久99| 国产69久久| 久久久久久亚洲综合影院红桃 | 日韩av高清在线| 国产欧美日韩久久| 欧美 另类 交| 好看的中文字幕在线播放| 欧美日韩国产一区中文午夜| 国产三级日本三级在线播放| 91成人精品观看| 亚洲精品一区二区三区四区高清 | 999国产精品视频| 欧美成人h版在线观看| 国产乡下妇女做爰| 日韩精品一二三区| 亚洲xxxxx电影| 午夜一区在线观看| 国产精品日产欧美久久久久| 日韩专区第三页| 亚洲黄色中文字幕| 在线观看91精品国产麻豆| 亚洲图片欧美另类| 成人黄色av| 欧美激情一级欧美精品| 福利网址在线观看| 国产麻豆欧美日韩一区| 开心色怡人综合网站| 国产成人在线视频免费观看| 欧美日韩国产一中文字不卡| 天天av天天操| 亚洲成aⅴ人片久久青草影院| 久久久999精品| 成人午夜淫片100集| 国产精品自拍av| 日本午夜一区二区三区| 女子免费在线观看视频www| 欧美在线啊v一区| 污污免费在线观看| 99久久www免费| 日韩av免费在线看| 丰满少妇被猛烈进入| 中文字幕av免费专区久久| 国精产品一区一区三区视频| 二区三区精品| 亚洲最新av在线网站| 日本天堂在线视频| 国内精品自线一区二区三区视频| 欧美日韩电影一区二区| 大香伊人中文字幕精品| 欧美高清dvd| 国产一二三四五区| 亚洲一区国产一区| 国产传媒一区| 亚洲精品白浆| 欧美一区二区成人| 91无套直看片红桃在线观看| 久久一区中文字幕| 久久精品二区| segui88久久综合9999| 日韩欧美黄色影院| 高h视频免费观看| 国产主播一区二区| 亚洲一区二区不卡视频| se01亚洲视频| 国产香蕉97碰碰久久人人| 国产成人免费观看视频 | 国产精品久久久亚洲一区| 999热视频在线观看| а√天堂8资源在线官网| 欧美另类变人与禽xxxxx| 久久久久久国产免费a片| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美~级网站不卡| 国产精品视频网址| www.亚洲资源| 欧美日韩国产高清一区| 91麻豆精品久久毛片一级| 青青草原综合久久大伊人精品优势| 青青草成人网| 欧美日韩女优| www欧美日韩| 国产精品国产精品国产专区| 中文字幕欧美一区| 成年人网站av| 精品福利av| 免费成人在线观看av| 精品日本视频| 久久久国产精品免费| 国产哺乳奶水91在线播放| 亚洲欧美激情在线| 无码人妻aⅴ一区二区三区玉蒲团| 欧美色图麻豆| 免费成人av网站| 丰满少妇一区| 欧美老女人xx| 你懂的网站在线| 色欧美片视频在线观看在线视频| xxxx日本黄色| 国产在线精品一区二区夜色| 日本黄色片一级片| 视频福利一区| 国产欧美在线播放| 在线免费观看a视频| 亚洲第一色在线| 91黑人精品一区二区三区| 亚洲欧洲精品天堂一级| 欧美激情一区二区三区p站| 免费看亚洲片| 三年中国中文在线观看免费播放| a级日韩大片| 国产精品扒开腿做爽爽爽视频| 免费在线毛片网站| 亚洲国产日韩欧美在线动漫| 亚洲天堂视频在线| 亚洲成人免费在线观看| 欧美激情 一区| 高清在线不卡av| 热久久精品免费视频| 午夜精品久久久久99热蜜桃导演| 久久综合福利| 91麻豆精品激情在线观看最新| 欧美自拍视频在线| 成a人片在线观看| 亚洲欧美国产精品va在线观看| 91成人国产综合久久精品| 精品久久久久人成| 色欲人妻综合网| 国产网红主播福利一区二区| 日本泡妞xxxx免费视频软件| 欧美aaa在线| 欧美深夜福利视频| **女人18毛片一区二区| 免费电影一区| 国产伦乱精品| 91在线观看免费| 婷婷午夜社区一区| 97香蕉久久超级碰碰高清版| www免费视频观看在线| 国产香蕉精品视频一区二区三区| 色呦呦中文字幕| 欧美一区二区三区免费在线看| 97人妻一区二区精品视频| 亚洲制服丝袜在线| 91n在线视频| 国产拍欧美日韩视频二区| 亚洲av无码一区东京热久久| 国产一区二区三区在线观看免费视频 | av电影在线网| 亚洲日韩中文字幕| 亚洲aaa在线观看| 亚洲成人精品久久| 亚洲国产综合网| 欧美一区二区私人影院日本| 中文字幕欧美色图| 欧美自拍偷拍午夜视频| 亚洲欧美日韩激情| 欧美日韩在线视频观看| 日韩精品一区二区av| 亚洲成av人片| 久久免费少妇高潮99精品| 亚洲视频一区二区在线| 99久久99久久精品免费| 久久久不卡网国产精品二区| 成人h动漫精品一区| 99精品视频一区二区| 五月天丁香社区| 成人免费不卡视频| 美女扒开腿免费视频| 成人在线视频一区二区| 佐佐木明希电影| 成人激情黄色小说| 中国黄色片视频| 97久久超碰精品国产| 极品粉嫩小仙女高潮喷水久久| av电影在线观看不卡| 成人免费无码大片a毛片| 91在线视频观看| 最近中文字幕免费| 欧美国产97人人爽人人喊| 四虎成人免费影院| 亚洲日本va在线观看| 青青青在线免费观看| 亚洲影视资源网| 精品无码免费视频| 精品色蜜蜜精品视频在线观看| 成年人午夜视频| 一本色道a无线码一区v| 九九热最新视频| 91精品国产一区二区| 不卡视频在线播放| 日韩电影中文字幕在线观看| 视频三区在线观看| 亚洲一区999| 国产激情在线视频| 午夜免费日韩视频| 久久久人成影片一区二区三区在哪下载| 国产精品国产三级国产专播精品人| 免费在线成人激情电影| 亚洲一区二区久久久久久| 国产毛片精品| 台湾成人av| 欧美日韩视频| 国产成人a亚洲精v品无码| 男男视频亚洲欧美| 91porn在线| 欧美激情综合五月色丁香小说| 国产性生活大片| 精品国产老师黑色丝袜高跟鞋| 亚洲天堂视频在线播放| 欧美一区二区三区精品| 完全免费av在线播放| 97se亚洲国产综合自在线| 国产一二三四五区| 亚洲黄色小视频| 午夜精品一区二| 日韩一区二区视频| 日本福利在线观看| 理论片在线不卡免费观看| 毛片在线网站| 国产精品久久久久久久久免费看| 亚洲一区二区三区四区电影| 日韩免费电影一区二区三区| 红桃视频欧美| 一级在线免费视频| 波多野结衣中文字幕一区二区三区| 丁香六月激情综合| 黑人巨大精品欧美一区二区三区| 国产伦理吴梦梦伦理| 日韩精品免费综合视频在线播放| 国产丝袜在线| 国产精品久久久久久久久久久久| 电影一区二区在线观看| 在线观看日韩羞羞视频| 午夜亚洲激情| 国产精品嫩草69影院| 中文字幕中文字幕在线一区| 欧美a视频在线观看| 精品成人私密视频| fc2ppv国产精品久久| 国产精品麻豆va在线播放| 日韩mv欧美mv国产网站| 奇米777四色影视在线看| 久久国产日韩欧美精品| 暖暖视频在线免费观看| 久久久成人av| 香蕉成人影院| 久久久久久久久一区二区| 欧美日韩网站| 国产乱码一区二区三区四区| 国产亚洲欧洲一区高清在线观看| 国产在线观看成人| 日韩色视频在线观看| 免费看美女视频在线网站| 国产精品久久久精品| 曰本一区二区三区视频| 国产乱子伦农村叉叉叉| 国产suv精品一区二区6| 三级全黄做爰视频| 欧美三级午夜理伦三级中视频| 久青草国产在线| 欧美亚洲在线观看| 欧美网色网址| 久久久性生活视频| 成人精品视频一区二区三区尤物| 青春草免费视频| 精品日韩在线观看| 人交獸av完整版在线观看| 91免费人成网站在线观看18| 国产精品二区不卡| 午夜免费一级片| 亚洲欧美成人一区二区三区| 国产精品一区二区免费视频| 久热爱精品视频线路一| 99er精品视频| 伊人久久青草| 国内精品国产成人| www.超碰在线观看| 精品乱码亚洲一区二区不卡| 国产夫妻在线| 蜜桃视频在线观看成人| 日韩不卡一区二区三区| 欧美日韩国产一二三区| 欧美男人的天堂一二区| fc2ppv国产精品久久| 国产精品久久一区二区三区| 99精品国产在热久久婷婷| 永久免费看mv网站入口78| 欧美在线综合视频| 免费高清在线观看| 成人欧美一区二区三区视频| av成人黄色| 黄色av免费播放| 欧美一级久久久| 超碰在线99| 日韩av影视| 国产精品自拍一区| 国产精品100| 日韩中文理论片| 88久久精品| 免费黄色福利视频| 国产精品久线在线观看| 亚洲av综合色区无码一二三区 | 神马影院一区二区| 国产九色精品成人porny| 日韩激情在线播放| 最近2019免费中文字幕视频三 | 国产麻豆精品久久一二三| 国产乡下妇女做爰| 在线成人中文字幕| 亚洲伊人影院| 无需播放器的av| 亚洲国产裸拍裸体视频在线观看乱了| 九九九伊在人线综合| 2019国产精品视频| 欧美亚洲一区| 老女人性淫交视频| 中文久久电影小说| 激情伊人五月天| 国产精品看片你懂得| 污视频网站在线播放| 成人免费网站在线| 国产精品亚洲综合久久| 亚洲人与黑人屁股眼交| 日韩精品免费一线在线观看| 玖玖精品一区|