給了a、b兩個單詞和乙個單詞集合dict,每個的長度都相同。我們希望通過若干次操作把單詞a變成單詞b,每次操作可以改變單詞中的乙個字母,同時,新產生的單詞必須是在給定的單詞集合dict中。求所有行得通步數最少的修改方法。
舉個例子如下: given: a = "hit" b = "cog" dict = ["hot","dot","dog","lot","log"]
return [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
即把字串a = "hit"轉變成字串b = "cog",有以下兩種可能:
"hit" -> "hot" -> "dot" -> "dog" -> "cog";
"hit" -> "hot" -> "lot" -> "log" ->"cog"。
首先把所有的單詞放到乙個列表裡面,然後組成乙個無相圖,然後從a點開始查詢到b點的最短路徑,使用了dijkstra演算法 來查詢最短路徑,然後把路徑都打出來。。我用題目的測試用例是通過了,自己寫了幾個測試用例也過了,但是提交以後失敗了。。。汗。。**寫得很匆忙。。非常亂哈。。總結一下再發出來,大家做過嗎,都過了麼。。。殘念啊。。。好久沒寫過演算法了,,**了。。。
#include #include #include #include #include #include using namespace std;
class solution
;
//比較函式,比較兩個字串的差別是否為1,如果不唯一,返回-1
int cmp(string a,string b)
if(flag==1)
return 0;
else
return -1;
}//輔助函式,返回向量中最後乙個元素的索引
int last(string str,vectorstrv)
}//主函式
vector< vector> findladders(string start, string end, set& dict)
//構造二維向量列的長度
waylist.resize(max_len);
//如果有向量和start只相差乙個字元,就將向量新增到二維向量表中
for(int i=0;i0)
// end if(cmp(waylist[i].back(),str.at(j))==0)
}// end if(waylist[i].size()>0)
}//end for
}// end if(i!=1)
}//end for
//找到重複路徑,表示已經檢索完畢,結束迴圈
if(flag==1)
break;
}//end while
for(int i=0;i> res;
set strset;
strset.insert("hot");
strset.insert("dot");
strset.insert("dog");
strset.insert("lot");
strset.insert("log");
std::cout << "cog" for(int i=0;i";
cout << " " << endl; }
return 0;
}
輸出:
hit-->hot-->lot-->log-->cog-->
hit-->hot-->dot-->dog-->cog-->
結果還是失敗。。呵呵。。。
最小運算元
剛才在剛果準備挑戰最小運算元的。可是操作失誤,調教了白 在自己電腦上用c 環境試了試。竟然花了3個小時,哎,挑戰也是失敗了。題目詳情 給了a b兩個單詞和乙個單詞集合dict,每個的長度都相同。我們希望通過若干次操作把單詞a變成單詞b,每次操作可以改變單詞中的乙個字母,同時,新產生的單詞必須是在給定...
最小運算元遞迴實現
題目 給了a b兩個單詞和乙個單詞集合dict,每個的長度都相同。我們希望通過若干次操作把單詞a變成單詞b,每次操作可以改變單詞中的乙個字母,同時,新產生的單詞必須是在給定的單詞集合dict中。求所有行得通步數最少的修改方法。舉個例子如下 given a hit b cog dict hot dot...
25最小運算元問題
題目描述 給定乙個單詞集合dict,其中每個單詞的長度都相同。現從此單詞集合dict中抽取兩個單詞a b。希望通過若干次操作把單詞a變成單詞b,每次操作可以改變單詞的乙個字母,同時,每次操作後,新產生的單詞必須是在給定的單詞集合dict中。求所有行得通步數最少的修改方法。舉個例子如下 given a...