随笔- 509  文章- 0  评论- 151  阅读- 22万 

2014-04-29 04:22

题目:给定一堆长度都相等的单词,和起点、终点两个单词,请从这堆单词中寻找一条变换路径,把起点词变成终点词,要求每次变换只能改一个字母。

解法:Leetcode中有Word Ladder,这题基本思路一致。

代码:

复制代码
 1 // 18.10 Given a list of words, all of same length. Given a source and a destionation words, you have to check if there exists a path between the two. Every time you may change only one letter in the word.
 2 // This is my code from leetcode problem set: word ladder
 3 #include <string>
 4 #include <unordered_map>
 5 #include <unordered_set>
 6 #include <vector>
 7 using namespace std;
 8 
 9 class Solution {
10 public:
11     vector<vector<string> > findLadders(string start, string end, unordered_set<string> &dict) {
12         unordered_map<string, vector<string> > back_trace;
13         vector<unordered_set<string> > level(2);
14         
15         dict.insert(start);
16         dict.insert(end);
17         
18         int flag, nflag;
19         flag = 0;
20         nflag = !flag;
21         level[flag].insert(start);
22         
23         unordered_set<string>::iterator usit;
24         char ch, old_ch;
25         string word;
26         while (true) {
27             flag = !flag;
28             nflag = !nflag;
29             level[flag].clear();
30             for (usit = level[nflag].begin(); usit != level[nflag].end(); ++usit) {
31                 dict.erase(*usit);
32             }
33             for (usit = level[nflag].begin(); usit != level[nflag].end(); ++usit) {
34                 word = *usit;
35                 for (size_t i = 0; i < word.size(); ++i) {
36                     old_ch = word[i];
37                     for (ch = 'a'; ch <= 'z'; ++ch) {
38                         if (ch == old_ch) {
39                             continue;
40                         }
41                         word[i] = ch;
42                         if (dict.find(word) != dict.end()) {
43                             back_trace[word].push_back(*usit);
44                             level[flag].insert(word);
45                         }
46                     }
47                     word[i] = old_ch;
48                 }
49             }
50             if (level[flag].empty() || level[flag].count(end) > 0) {
51                 // found or not found
52                 break;
53             }
54         }
55         
56         single_result.clear();
57         for (size_t i = 0; i < result.size(); ++i) {
58             result[i].clear();
59         }
60         result.clear();
61         
62         if (!back_trace.empty()) {
63             recorverPath(back_trace, end);
64         }
65         
66         return result;
67     }
68 private:
69     vector<vector<string> > result;
70     vector<string> single_result;
71     
72     void recorverPath(unordered_map<string, vector<string> > &back_trace, string cur) {
73         if (back_trace.count(cur) == 0) {
74             // this word has no back trace, it is unreachable.
75             vector<string> single_path(single_result);
76             
77             single_path.push_back(cur);
78             reverse(single_path.begin(), single_path.end());
79             result.push_back(single_path);
80             return;
81         }
82         
83         const vector<string> &v = back_trace[cur];
84         vector<string>::const_iterator usit;
85         
86         single_result.push_back(cur);
87         for (usit = v.begin(); usit != v.end(); ++usit) {
88             recorverPath(back_trace, *usit);
89         }
90         single_result.pop_back();
91     }
92 };
复制代码

 

 posted on   zhuli19901106  阅读(243)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示