zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第18章:难题——题目10

    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 };
  • 相关阅读:
    清空
    从一个例子看现代C++的威力
    C++11实现一个自动注册的工厂
    REST RPC架构思想
    thinking in object pool
    worksteal thread pool
    check member function
    C# string 常用功能的方法扩展
    C#设计模式总结
    JAVA过滤器和拦截器的区别
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3698378.html
Copyright © 2011-2022 走看看