給定兩個單詞(beginword 和 endword)和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則:
每次轉換只能改變乙個字母。
轉換過程中的中間單詞必須是字典中的單詞。
說明:示例 1:
輸入: beginword = "hit", endword = "cog", wordlist = ["hot","dot","dog","lot","log","cog"] 輸出: 5 解釋: 乙個最短轉換序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的長度 5。
示例 2:
輸入: beginword = "hit" endword = "cog" wordlist = ["hot","dot","dog","lot","log"] 輸出: 0 解釋: endword "cog" 不在字典中,所以無法進行轉換。
用dfs和bfs都行,本題用bfs效率更高。
最開始想的是把每個單詞能轉成的單詞用multimap記錄下來。
然後再用bfs進行遍歷,這樣就減少了重複進行對比的次數。
但是如果單詞多了起來後,效率就很低了。
class solution
if(cnt == 1)
}for (int i = 0; i < wordlist.size(); i++)
if (cnt == 1)}}
queueq;
q.push(beginword);
mapvisit;
visit[beginword] = true;
int ans = 0;
while(!q.empty())
if (!visit[(*it).second])}}
}return 0;
}};
優化1:倒著搜尋比正著搜尋效率更高,因為倒著搜尋無效的結果比正著的少很多。
class solution
if(cnt == 1)
}for (int i = 0; i < wordlist.size(); i++)
if (cnt == 1)}}
queueq;
q.push(endword);
mapvisit;
visit[endword] = true;
int ans = 0;
while(!q.empty())
if (!visit[(*it).second])}}
}return 0;
}};
優化2:
因為只有小寫字母,字母只有26個,所以用在每個位置進行字母的變化,再用上set的高效率查詢。
每次查詢的複雜度為,字串長度 * 26 * set.find()
倒著查詢,效率更高。
class solution
}front = temp;}}
}return 0;
}};
LeetCode 127 單詞接龍
解題思路 1 這道題要找乙個最短路徑,可以聯想到圖的相關演算法 雖然我當時沒想到 那麼是不是應該使用最短路徑的相關演算法呢。其實不用 因為這個圖里每條邊的長度都是1,用乙個廣度優先演算法就搞定了。2規模的問題,如果你遍歷list裡的每個單詞的話,你會發現一直超時,因為有的list的規模給到了上千,每...
Leetcode 127 單詞接龍
給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 如果不存在這樣的轉換序列,返回 0。所有單詞具有相同的長度。所有單詞只由...
Leetcode 127 單詞接龍
給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endword cog wo...