这是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;
}
}
};