Same Tree
描述
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.
For example,
Given:
beginWord = “hit”
endWord = “cog”
wordList = [“hot”,”dot”,”dog”,”lot”,”log”,”cog”]
As one shortest transformation is “hit” -> “hot” -> “dot” -> “dog” -> “cog”,
return its length 5.
Note:
*Return 0 if there is no such transformation sequence.
*All words have the same length.
*All words contain only lowercase alphabetic characters.
*You may assume no duplicates in the word list.
*You may assume beginWord and endWord are non-empty and are not the same.
分析
题意很好理解,两个单词只有一个字母不同时才可以进行转化。
可以这样思考:如果两个单词如果只有一个字母不同(即可以发生转化时),就认为它们两者之间有联系,用一条边相连,则问题可以规划为从beginWord到endWord之间的最短路的问题。
我们可以从beginWord出发,寻找可以与它相连的点,直到到达endWord。同时,我们还要考虑,一旦某个节点我们访问过了,这个顶点是否可以移除呢?答案是肯定的,因为如果在本次访问之前某节点就被访问过了,说明之前有达到它的更短路,显然最优路径中每个结点只会被访问一次,所以可以放心的将其移除。
经过上面的分析,可以明显感受到,应该就是宽度优先搜索最短路径的问题。
我的代码
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
int dis=1;
int len=wordList.size();
int *visit=new int[len];
memset(visit,0,len*sizeof(int));
queue<string> q;
for (int i=0; i<len; i++)
{
if (cmpStr(beginWord, wordList[i])==true)
{
if (wordList[i] == endWord) return 2;
q.push(wordList[i]);
visit[i]=1;
}
}
if (q.empty()) return 0;
dis++;
while (!q.empty())
{
int _siz=q.size();
while (_siz)
{
string tmp(q.front());
if (tmp == endWord) return dis;
for (int i=0; i<len; i++)
{
if (!visit[i])
{
if (cmpStr(tmp, wordList[i]))
{
if (wordList[i] == endWord) return dis+1;
q.push(wordList[i]);
visit[i]=1;
}
}
}
q.pop();
_siz--;
}
dis++;
}
return 0;
}
bool cmpStr(string s1, string s2)
{
int len=s1.size();
int diff=0;
for (int i=0; i<len; i++)
{
if (s1[i] != s2[i])
{
diff++;
}
}
if (diff == 1) return true;
else return false;
}
};