多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 【一天一道LeetCode】#72. Edit Distance

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

來源:程序員人生   發布時間:2016-06-27 08:23:58 閱讀次數:2555次

1天1道LeetCode

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

(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拿到就覺得需要用到動態計劃,因而斟酌到用遞歸來解決,3種情況,順次進行,可是隨著遞歸的加深,自但是然就超時了!

/* 注:此代碼沒有過量測試,如有毛病,請各位留言指出 */ 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; } //如果該位上相等則繼續 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); } } } };

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

這里寫圖片描述

那末,下面我們來看看動態計劃最重要的狀態轉移方程。
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]; } };
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美色图另类小说 | 另类国产| 亚洲精品欧美精品一区二区 | 亚洲欧美成人永久第一网站 | 国产免费69成人精品视频 | 国产欧美日韩亚洲精品区2345 | 福利片免费一区二区三区 | 亚洲精品αv一区二区三区 亚洲精品播放 | 久久优| 第一精品福利 | 欧美18videosex| 国产精品免费久久久久影院 | 日本人成免费大片 | 欧美多人性受xxxx喷水 | 欧美亚洲免费久久久 | 国产午夜精品一区二区三区 | 中文字幕3 | 欧美jizz40性欧美 | 成人欧美一区二区三区视频xxx | 国产模特众筹精品视频 | 色视频在线播放 | 亚洲国产日韩欧美一区二区三区 | 最新中文字幕在线观看 | 中文字幕日本一本二本三区 | 福利片在线观看 | 亚洲一区二区成人 | 国产区精品一区二区不卡中文 | 日韩亚洲国产欧美精品 | 日韩欧美成人乱码一在线 | 麻豆影视视频高清在线观看 | 国产成人精选视频69堂 | 国产一区二区视频在线观看 | 秋霞午夜鲁丝片午夜精品久 | 手机看片日韩高清国产欧美 | 最近2019中文字幕最新 | 日韩欧美成末人一区二区三区 | 伊人网址 | 最近中文字幕mv在线高清 | 第一页在线观看 | 精品欧美一区二区三区在线观看 | 久久99国产精一区二区三区! |