這是leetcode上第127題。給出原單詞和目標單詞和一個字典,在字典中找到過渡單詞,使得原單詞可以變爲目標單詞。
要求:一次只變一個字母。
輸出爲:最短變化路徑的長度。
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
if(beginWord.size() != endWord.size())
return 0;
if(beginWord == endWord)
return 1;
if(!is_in_step(endWord, wordList)) // 如果目標不在wordList中,返回0
return 0;
int step_size = 0;
queue<string> q;
q.push(beginWord);
int cnt = 2;
list<string> strList(wordList.begin(), wordList.end()); // 將wordList放入鏈表中便於操作
while(!q.empty())
{
// 層序遍歷
int qsize = q.size();
for(int ii = 0; ii < qsize; ii++)
{
string s1 = q.front();
q.pop();
for(list<string>::iterator it = strList.begin(); it != strList.end(); )
{
// 判斷strList中的詞是否與可以通過s1一步變化得到。
if(is_step(s1, *it)){
// 如果可以,則判斷是否爲目標單詞
if(*it == endWord){
return cnt; // 如果是目標單詞,則返回
}
else{
// 如果不是目標單詞,加入隊列,並將之從列表中刪除
q.push(*it);
it = strList.erase(it);
}
}
else ++it;
}
}
cnt++;
}
return 0;
}
private:
// 判斷s1是否可以經過一步變化變成s2
bool is_step(string s1, string s2)
{
if(s1.size() != s2.size())
return false;
int diff_cnt = 0;
for(int i = 0; i < s1.size(); i++){
if(s1[i] != s2[i])
{
diff_cnt++;
if(diff_cnt > 1){
return false;
}
}
}
if(diff_cnt == 0)
return false;
return true;
}
// 判斷endWord是否在wordList中
bool is_in_step(string endWord, vector<string>& wordList){
vector<string>::iterator it = wordList.begin();
it = find(wordList.begin(), wordList.end(), endWord);
if(it == wordList.end()){
return false;
}
else{
return true;
}
}
};