【筆記試験練習問題】leetcode 127.Word Ladder(広さ優先遍歴)
これはleetcodeの127番目の問題です.元の単語とターゲットの単語と辞書を与えて、辞書の中で遷移単語を見つけて、元の単語がターゲットの単語になることができます.
要求:一度に1文字だけ変更します.
出力は:最短変化パスの長さです.
要求:一度に1文字だけ変更します.
出力は:最短変化パスの長さです.
class Solution {
public:
int ladderLength(string beginWord, string endWord, vector& 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 q;
q.push(beginWord);
int cnt = 2;
list 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::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& wordList){
vector::iterator it = wordList.begin();
it = find(wordList.begin(), wordList.end(), endWord);
if(it == wordList.end()){
return false;
}
else{
return true;
}
}
};