日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 【一天一道LeetCode】#72. Edit Distance

【一天一道LeetCode】#72. Edit Distance

來源:程序員人生   發(fā)布時間:2016-06-27 08:23:58 閱讀次數(shù):2562次

1天1道LeetCode

本系列文章已全部上傳至我的github,地址:ZeeCoder‘s Github
歡迎大家關(guān)注我的新浪微博,我的新浪微博
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處

(1)題目

Given two words word1 and word2, find the minimum number of steps ?>required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

(2)解題

這道題1拿到就覺得需要用到動態(tài)計劃,因而斟酌到用遞歸來解決,3種情況,順次進(jìn)行,可是隨著遞歸的加深,自但是然就超時了!

/* 注:此代碼沒有過量測試,如有毛病,請各位留言指出 */ class Solution { public: int minDis = 1000000; int minDistance(string word1, string word2) { vector<int> minpath(10000,10000); getMinDis(word1,word2,0,0,minpath); return minDis; } void getMinDis(string word1, string word2, int idx, int count,vector<int>& minpath) { if(minpath[idx] <= count) return; //為了減少遞歸深度,可是還是超時了 if (word1 == word2) { minDis = minDis < count ? minDis : count; return; } //如果該位上相等則繼續(xù) if(idx < word1.size() && idx < word2.size() && word1[idx] == word2[idx]) getMinDis(word1, word2, idx + 1, count,minpath); else { if (idx < word1.size())//idx小于word1的時候才能刪除 { string tword1 = word1; tword1.erase(tword1.begin() + idx); getMinDis(tword1, word2, idx, count + 1,minpath); } if (idx < word2.size()) //插入話需要idx小于Word2的長度 { string tword1 = word1; tword1.insert(idx, 1, word2[idx]); getMinDis(tword1, word2, idx + 1, count + 1,minpath); } if (idx < word1.size() && idx < word2.size())//替換則需要都小于 { string tword1 = word1; tword1[idx] = word2[idx]; getMinDis(tword1, word2, idx + 1, count + 1,minpath); } } } };

下面,主角出現(xiàn)了!看到這個算法真正覺得算法的美好了,由繁化簡!
首先我們定義1個數(shù)組,dp[i][j],這個數(shù)組代表了word1的0~i轉(zhuǎn)換到word2的0~j需要的最小步數(shù)。很明顯,該矩陣應(yīng)當(dāng)初始化為:dp[0][i] = i和dp[i][0] = i,以下圖(以ACE->ADEF為例):

這里寫圖片描述

那末,下面我們來看看動態(tài)計劃最重要的狀態(tài)轉(zhuǎn)移方程。
1、插入操作:
dp[1][1]表示從A到A,dp[0][1]表示從”“到A,那末word1插入1個A就得到A,所以dp[1][1] = dp[0][1]+1
2、刪除操作:
dp[1][1]表示從A到A,dp[1][0]表示從A到””,那末word1需要刪除1個A,所以dp[1][1] = dp[1][0]+1
3、替換操作:
dp[1][1]表示從A到A\,dp[0][0]表示從”“到”“,那末dp[1][1] = dp[0][0];
dp[2][2]表示從AC到AD,需要替換操作,所以dp[2][2] = dp[1][1]+1;
看到這里大概都明白了這個算法的步驟了,dp[1][1]到底等于多少呢?
答案不言而喻,dp[1][1]等于3者中的最小值。
算法到最后,矩陣dp得值看下圖:
這里寫圖片描述

說這么多,代碼見真招!

class Solution { public: int minDistance(string word1, string word2) { int row = word1.length(); int col = word2.length(); //初始化 vector<vector<int>> dpath(row+1,vector<int>(col+1,0)); for(int i = 0 ; i < col+1 ; i++)/ { dpath[0][i] = i; } for(int i = 0 ; i < row+1 ;i++) { dpath[i][0] = i; } for(int i = 1; i < row+1 ;i++) { for(int j = 1 ; j < col+1;j++) { //3者取最小 dpath[i][j] = min(dpath[i-1][j]+1,dpath[i][j-1]+1); dpath[i][j] = min(dpath[i][j],dpath[i-1][j-1]+(word1[i-1] == word2[j-1]?0:1)); } } return dpath[row][col]; } };
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久久久美女视频 | 中文字幕一区二区三区在线视频 | 99精品国产高清一区二区麻豆 | 美女h网站| av毛片在线看 | 欧美中文字幕 | 欧美黄绝片 | 福利视频网址 | 黄色avv| 三级在线看 | 精品播放 | 福利网站在线观看 | 国产精品美女一区二区三区 | 日韩国产综合av | 欧州一区二区 | 国产一区二区三区观看 | 国产成人午夜精品5599 | 在线观看福利电影 | 免费看成年人视频在线观看 | 国产精品久久久久久久7电影 | 国产精品久久久久久久久久小说 | 欧美亚洲一二三 | 久久九九久久精品 | 伊人色综合网 | 成人av片在线观看 | 国内精自视频品线六区免费 | 日韩网站免费观看 | 综合久久一区 | 久久精品视频在线 | 麻豆传媒一区二区三区 | 午夜伦理影院 | 日韩免费一区 | 亚洲一区二区三区四区免费观看 | 在线免费小视频 | 中文字幕综合网 | 99国产精品久久久久久久 | 日韩午夜视频在线观看 | 极品久久 | 亚洲精品久久 | 国产一区二区在线观看免费 | 俺去俺来也在线www色官网 |