leetcode 127. 單詞接龍(C++)

我很忙2010發表於2020-10-23

給定兩個單詞(beginWord 和 endWord)和一個字典,找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則:

  1. 每次轉換隻能改變一個字母。
  2. 轉換過程中的中間單詞必須是字典中的單詞。

說明:

  • 如果不存在這樣的轉換序列,返回 0。
  • 所有單詞具有相同的長度。
  • 所有單詞只由小寫字母組成。
  • 字典中不存在重複的單詞。
  • 你可以假設 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" 不在字典中,所以無法進行轉換。

C++

class Solution {
public:
	int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
		unordered_set<string> word;
		for (auto s : wordList) {
			word.insert(s);
		}
		if (word.find(endWord) == word.end()) {
			return 0;
		}
		queue<string> que;
		que.push(beginWord);
		unordered_set<string> visited;
		visited.insert(beginWord);
		int num = 1;
		while (!que.empty()) {
			int m = que.size();
			for (int i = 0; i < m; i++) {
				string str = que.front();
				que.pop();
				if (str == endWord) {
					return num;
				}
				for (int j = 0; j < str.size(); j++) {
					string ss = str;
					for (int k = 0; k < 26; k++) {
						char c = k + 'a';
						if (c != str[j]) {
							ss[j] = c;
						}
						if (word.find(ss) != word.end() && visited.find(ss) == visited.end()) {
							visited.insert(ss);
							que.push(ss);
						}
					}
				}
			}
			num++;
		}
		return 0;
	}
};

 

相關文章