日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP第五周答案,算法设计与分析第五周作业——Word Ladder

發(fā)布時(shí)間:2025/3/20 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP第五周答案,算法设计与分析第五周作业——Word Ladder 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法設(shè)計(jì)與分析第五周作業(yè)——Word Ladder

上周找了一道深度搜索優(yōu)先搜索的算法題來做,于是這周就選了一道廣度優(yōu)先搜索算法題來試試手。

本周所選題目:原題目鏈接

題目詳情

題目大意:給出一個(gè)字符串(單詞)集合和兩個(gè)字符串,一個(gè)為開始字符串,一個(gè)為結(jié)束字符串,每次通過改變一個(gè)字符使得從開始字符串依次轉(zhuǎn)變?yōu)樽址侠锏淖址?#xff0c;直到轉(zhuǎn)化為結(jié)束字符串,求所用到的最少的步數(shù)。

注:如果不存在這樣一條路徑,則返回0;

所有涉及到的字符串都是一樣大小的,且所有字母都為小寫;

字符串集合中無重復(fù)的字符串,開始字符串和結(jié)束字符串非空。

樣例說明:Input:

beginWord = "hit",

endWord = "cog",

wordList = ["hot","dot","dog","lot","log","cog"]

Output: 5

Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",

return its length 5.

Input:

beginWord = "hit"

endWord = "cog"

wordList = ["hot","dot","dog","lot","log"]

Output: 0

Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.

題目分析和算法設(shè)計(jì)

很顯然,題目需要我們通過對(duì)每個(gè)單詞進(jìn)行廣搜以求得最短的路徑??梢詷?gòu)建這樣的模型:以每個(gè)字符串為頂點(diǎn),如果字符串集合中存在一個(gè)只需要當(dāng)前字符串修改一個(gè)字符就能達(dá)到的字符串,那么這兩個(gè)字符串之間就存在有一條邊,可以理解為邊的值為1。

根據(jù)已知條件,我們可知知道應(yīng)該使用的數(shù)據(jù)結(jié)構(gòu)為:set(無重復(fù)字符串):字符串集合,用來未訪問的存儲(chǔ)字符串;

queue:用來存儲(chǔ)當(dāng)前訪問的字符串;

其中,queue使用鍵值對(duì)來進(jìn)行對(duì)步數(shù)的記錄,每一個(gè)值由(當(dāng)前字符串,步數(shù))的鍵值對(duì)組成。

具體算法:依次對(duì)當(dāng)前字符串的各個(gè)字符進(jìn)行變換,如果變換之后得到的字符串在字符串集合中,那么說明是可以進(jìn)行轉(zhuǎn)換的,此時(shí)遞增步數(shù),并把該字符串放入到隊(duì)列中,同時(shí)從字符串集合中移除,直至轉(zhuǎn)換到結(jié)束字符串,返回當(dāng)前的步數(shù),即隊(duì)列值的數(shù)值。

代碼詳情class Solution {

public:

int ladderLength(string beginWord, string endWord, vector& wordVec) {

set wordList;

for (auto word : wordVec) {

wordList.insert(word);

}

if (wordList.find(endWord) == wordList.end()) return 0;

queue> que;

que.push(make_pair(beginWord, 1));

while(!que.empty()) {

auto val = que.front();

que.pop();

if(val.first == endWord) return val.second;

for(unsigned i = 0; i < val.first.size(); i++) {

string str = val.first;

for(char j = 'a'; j <= 'z'; j++) {

str[i] = j;

if(wordList.find(str) != wordList.end()) {

que.push(make_pair(str, val.second+1));

wordList.erase(str);

}

}

}

}

return 0;

}

};

上面的題目主要考察簡單的廣度優(yōu)先搜索算法,是比較簡單的。同時(shí)LeetCode上有一道Word Ladder II,雖然題目類似,Word Ladder II要求把具體的所有最短的路徑找出來作為返回值。下面我們來分析一下該題:

該題目大概思路跟Word Ladder是類似的,但是在細(xì)節(jié)方面是有更多需要考慮的。需要求字符串集合的集合,即具體的轉(zhuǎn)換路徑的集合,需要以下的數(shù)據(jù)結(jié)構(gòu)和變量:queue> paths:路徑集paths,用以保存所有路徑;

unordered_set dict:存未訪問過的字符串,初始化為輸入的字符串集;

unordered_set words:記錄已經(jīng)循環(huán)過的路徑中的詞;

level:整型變量,記錄循環(huán)中當(dāng)前路徑的長度;

minLevel:整型變量,記錄最短路徑的長度;

算法過程:把起始路徑加入路徑集paths,當(dāng)paths非空時(shí)進(jìn)行循環(huán),取隊(duì)列頭路徑,把路徑的最后一個(gè)達(dá)到的字符串拿出來進(jìn)行廣搜,即對(duì)每個(gè)字符,都從‘a(chǎn)’-‘z’進(jìn)行轉(zhuǎn)換,如果dict中有該中間轉(zhuǎn)換得到的字符串,說明滿足條件可以進(jìn)行路徑的記錄,此時(shí)判斷該字符串是否為結(jié)束字符串,如果是,則找到一條路徑,否則把得到的新路徑加入paths中,繼續(xù)循環(huán)。需要注意的是如果paths里的路徑的長度大于level,說明字典中的有些詞已經(jīng)存入路徑了,如果在路徑中重復(fù)出現(xiàn),則肯定不是最短路徑,所以我們需要在字典中將這些詞刪去,然后將words清空。

代碼詳情:class Solution {

public:

vector> findLadders(string beginWord, string endWord, vector& wordList) {

vector> res;

unordered_set dict(wordList.begin(), wordList.end());

vector p{beginWord};

queue> paths;

paths.push(p);

int level = 1, minLevel = INT_MAX;

unordered_set words;

while (!paths.empty()) {

auto t = paths.front();

paths.pop();

if (t.size() > level) {

for (string w : words) dict.erase(w);

words.clear();

level = t.size();

if (level > minLevel) break;

}

string last = t.back();

for (int i = 0; i < last.size(); ++i) {

string newLast = last;

for (char ch = 'a'; ch <= 'z'; ++ch) {

newLast[i] = ch;

if (!dict.count(newLast)) continue;

words.insert(newLast);

vector nextPath = t;

nextPath.push_back(newLast);

if (newLast == endWord) {

res.push_back(nextPath);

minLevel = level;

} else paths.push(nextPath);

}

}

}

return res;

}

};

謝謝閱讀。

參考資料:

總結(jié)

以上是生活随笔為你收集整理的PHP第五周答案,算法设计与分析第五周作业——Word Ladder的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。