zoukankan      html  css  js  c++  java
  • LeetCode OJ

    我发现在leetcode上做题,当我出现TLE问题时,往往是代码有漏洞,有些条件没有考虑到,这道题又验证了我这一想法。

    这道题是在上一道的基础上进一步把所有可能得转换序列给出。

    同样的先是BFS,与此同时需要一个hashMap记录下每个节点,和他所有父节点的对应关系,然后通过DFS,回溯所有可能的路径。

    下面是AC代码。

      1 /**
      2      * Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end,
      3      * @param start
      4      * @param end
      5      * @param dict
      6      * @return
      7      */
      8     public ArrayList<ArrayList<String>> findLadders(String start, String end, HashSet<String> dict) {
      9         
     10         //for BFS 
     11         LinkedList<String> queue = new LinkedList<String>();
     12         //store the words that have visited and in the dict, and its corresponding level
     13         HashMap<String,Integer> visited = new HashMap<String,Integer>();
     14         //the level information for every word
     15         LinkedList<Integer> level = new LinkedList<Integer>();
     16         //the word and its parents
     17         HashMap<String,ArrayList<String>> wP = new HashMap<String,ArrayList<String>>();
     18         queue.offer(start);
     19         level.offer(1);
     20         wP.put(queue.peek(), null);//start has no parents;
     21         visited.put(start, 1);
     22         while(!queue.isEmpty() && (!visited.containsKey(end) || level.peek() == visited.get(end)-1)){
     23             String par = queue.poll();
     24             int le = level.poll();
     25             
     26             //for every character in the word
     27             for(int i=0;i<par.length();i++){
     28                 
     29                 char[] words = par.toCharArray();
     30                 char o = words[i];//the original word
     31                 for(char c='a';c<='z';c++)
     32                 {
     33                     if(c!=o){
     34                         //subsitude by another char
     35                         words[i] = c;    
     36                         String changed = new String(words);
     37                         //the last-1 level . 
     38                         if(changed.equals(end))
     39                         {
     40                             visited.put(changed, le+1);// it.s very important!!!! Dont't forget!!
     41                             
     42                             if(wP.containsKey(end)){
     43                                 ArrayList<String> p = wP.get(end);
     44                                 p.add(par);
     45                                 wP.put(end, p);
     46                             }else{
     47                                 ArrayList<String> p = new ArrayList<String>();
     48                                 p.add(par);
     49                                 wP.put(end, p);
     50                             }    
     51                         }
     52                         //return le+1;
     53                         else if((visited.get(changed)==null || visited.get(changed) == le+1) && dict.contains(changed)){
     54                             //the condition is very important!!! otherwise, there will be duplicate.
     55                             if(!visited.containsKey(changed))
     56                             {
     57                                 queue.offer(changed);
     58                                 level.offer(le+1);
     59                             }
     60                             visited.put(changed,le+1);
     61                             
     62                             //update the word and his parents information
     63                             if(wP.containsKey(changed)){
     64                                 ArrayList<String> p = wP.get(changed);
     65                                 p.add(par);
     66                                 wP.put(changed, p);
     67                             }else{
     68                                 ArrayList<String> p = new ArrayList<String>();
     69                                 p.add(par);
     70                                 wP.put(changed, p);
     71                             }
     72                         }
     73                     }
     74                 }
     75                 
     76             }
     77         }
     78         ArrayList<ArrayList<String>> fl =new ArrayList<ArrayList<String>>();
     79         //it's very important!!! to Check whether it has such path
     80         if(!wP.containsKey(end))
     81             return fl;
     82         traceback(wP,end,fl, null);
     83         
     84         return fl;
     85      }
     86     /**
     87      * DFS ,对每个节点的父节点进行深度遍历
     88      * @param wP
     89      * @param word
     90      * @param fl
     91      * @param cur
     92      */
     93     private void traceback(HashMap<String,ArrayList<String>> wP, String word, ArrayList<ArrayList<String>> fl, 
     94             ArrayList<String> cur){
     95         if(wP.get(word)==null)
     96         {
     97             ArrayList<String> next = new ArrayList<String>();
     98             next.add(word);
     99             if(cur!=null && cur.size()>0)
    100                 next.addAll(cur);
    101             fl.add(next);
    102             return;
    103         }
    104         for(String p: wP.get(word)){
    105             ArrayList<String> next = new ArrayList<String>();
    106             next.add(word);
    107             if(cur!=null && cur.size()>0)
    108                 next.addAll(cur);
    109             traceback(wP, p, fl, next);
    110         }
    111     }
    有问题可以和我联系,bettyting2010#163 dot com
  • 相关阅读:
    Java 链表
    知识点归列
    HTML和CSS必须知道的重点难点问题
    函数表达式
    javascript原型链
    canvas成长树
    checkbox选中问题
    使用vue-cli脚手架自定义iview主题
    AI学习吧-Redis操作-事务、订阅
    AI学习吧-REDIS-常识
  • 原文地址:https://www.cnblogs.com/echoht/p/3700804.html
Copyright © 2011-2022 走看看