1.題目描述
2.解題思路
我一看到這個題目就覺得類似於最小生成樹,應該用貪心算法來做,貪心算法的思路如下:
從start串出發,找出一次變換可以得到的string串的集合S1,如果集合S1中包含有end串,那麼搜索結束,否則,搜索兩步之內能到達的串的集合S2,同樣判斷兩步之內能到達的串集合中是否有end串,以此類推,最終找到最短路徑。另外,路徑保存需要單獨設置一個數據結構,
最終算法描述如下(類最小生成樹):
於是有了下面的這份代碼:
提交online judge之後,小數據集沒問題,大數據集卻TLE了,分析了一下,主要是從curStep求nextStep的過程太耗時,我這個是O(N2)的時間復雜度,結果如下:
結果出來的一瞬間很美妙:
另外,輸出結果的方式也有改進的余地,如圖所示,程序中的path實際是這麼一張圖,實際就是一張鄰接表。
我的算法是從start開始深度搜索,直至找到end,當搜索到的最後一個節點不是end的時候其實都是無效搜索(而且比重很大),所以可以把上述這幅圖反過來,然後從end開始反向搜索,以空間換時間。