LeetCode - 127. Word Ladder

Given two words (beginWord and endWord), and a dictionary’s word list, find the length of shortest transformation sequence from beginWord to endWord, such that:

  1. Only one letter can be changed at a time.
  2. Each transformed word must exist in the word list. Note that beginWord is not a transformed word.

Example 1: 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.

Example 2:
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.

  DFS超时,BFS就AC。

// DFS: TLE
bool can_change(const string& str1, const string& str2)
{
	bool diff = false;
	for(int i = 0; i < str1.length(); ++i)
		if(str1[i] != str2[i]) {
			if (diff) return false;
			diff = true;
		}
	return true;
}

void dfs_127(const string& beginWord, const string& endWord, const vector<string>& wordList, vector<bool>& used, unsigned int steps, unsigned int& min_step)
{
	if (beginWord.compare(endWord) == 0){
		min_step = min(min_step, steps + 1);
		return;
	}
	for (int i = 0; i < wordList.size(); ++i) {
		if (used[i]) continue;
		if (can_change(beginWord, wordList[i]))	{
			used[i] = true;
			dfs_127(wordList[i], endWord, wordList, used, steps + 1, min_step);
			used[i] = false;
		}
	}
}

int ladderLength(string beginWord, string endWord, vector<string> wordList) {
	if (find(wordList.begin(), wordList.end(), endWord) == wordList.end()) return 0;

	unsigned int min_step = wordList.size() + 1;
	vector<bool> used(wordList.size(), false);
	dfs_127(beginWord, endWord, wordList, used, 0, min_step);
	return min_step == wordList.size() + 1 ? 0 : min_step;
}
// BFS: AC
bool can_change(const string& str1, const string& str2)
{
	bool diff = false;
	for(int i = 0; i < str1.length(); ++i)
		if(str1[i] != str2[i]) {
			if (diff) return false;
			diff = true;
		}
	return true;
}

int ladderLength(string beginWord, string endWord, vector<string> wordList) {
	if (find(wordList.begin(), wordList.end(), endWord) == wordList.end()) return 0;
	unsigned int steps = 1;
	queue<string> q;
	vector<bool> used(wordList.size(), false);
	const unsigned int len = wordList.size();
	q.emplace(std::move(beginWord));
	q.emplace("");
	
	while(!q.empty()) {
		auto str = q.front();
		q.pop();
		if(str.empty()){
			if (q.empty()) break;
			q.emplace("");
			++steps;
			continue;
		}
		for(unsigned int i = 0; i < len; ++i)
			if(!used[i] && can_change(str, wordList[i])) {
                if(wordList[i] == endWord) return ++steps;
				q.push(wordList[i]);
				used[i] = true;
			}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值