查看: 2308| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

Word Ladder II --- 一点小想法

🔗
xh_pku | 只看该作者 |倒序浏览
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 xh_pku 于 2016-12-31 05:27 编辑

https://discuss.leetcode.com/top ... -that-accpted-by-oj

这个是用BFS + DFS 两轮来做的,最坏情况必定是指数时间, 我想到一些加速的方法:

1.剪枝, 用memoize的方法把BFS中得到的层数位置存储下来,然后在DFS时如果遇到“层数不对”的情况就立即中断返回;

2.分块进行,从“搜索所有邻居”变为“搜索下一个邻居”, 这样可以减少分支数;
通过区别"forward edge" "backward edge" / "cross edge" ,然后只对forward edge 进行搜索
  1. public class Solution {
  2.         Set<String> unvisited;
  3.         Map<String, List<String>> neighborMap = new HashMap<>();
  4.         Map<String, Integer> layerMap = new HashMap<>();
  5.         LinkedList<String> queue = new LinkedList<String>();
  6.     public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
  7.         List<List<String>> results = new ArrayList<>();
  8.         // if beginWord is equal to endWord
  9.         if (beginWord.equals(endWord)) {
  10.                 ArrayList<String> list = new ArrayList<>();
  11.                 list.add(beginWord);
  12.                 results.add(list);
  13.                 return results;
  14.         }
  15.         
  16.         unvisited = new HashSet<String>(wordList);
  17.         unvisited.add(endWord);
  18.         unvisited.add(beginWord);

  19.         queue.offer(beginWord);
  20.         int layers = BFS(beginWord, endWord, wordList);  // first compute the min words in between;
  21.         layerMap.put(endWord, layers + 1);
  22.         //reinitialize
  23.         unvisited = new HashSet<String>(wordList);
  24.         unvisited.add(endWord);
  25.         unvisited.remove(beginWord);   // add the first one into stack
  26.         List<String> stack = new ArrayList<>();  
  27.         stack.add(beginWord);
  28.         DFS(results, beginWord, endWord, wordList, layers, stack);
  29.         return results;
  30.     }

  31.     private void DFS(List<List<String>> results, String beginWord, String endWord, Set<String> wordList, int layers, List<String> stack) {
  32.                 String string = stack.get(stack.size() - 1);
  33.                 if (stack.size() == layers + 1) {
  34.                         if (string.equals(endWord)) {
  35.                                 results.add(new ArrayList<>(stack));
  36.                         }
  37.                         return;
  38.                 }
  39.                 // explore all of its neighbors;
  40.                 for (String neighbor : neighborMap.get(string)) {
  41.                         if (layerMap.get(neighbor) == null || layerMap.get(neighbor) != layerMap.get(string) + 1)
  42.                                 continue;
  43.                         unvisited.remove(neighbor);
  44.                         stack.add(neighbor);
  45.                         DFS(results, beginWord, endWord, wordList, layers, stack);
  46.                         unvisited.add(neighbor);
  47.                         stack.remove(stack.size() - 1);
  48.                 }
  49.         }

  50.         private int BFS(String beginWord, String endWord, Set<String> wordList) {
  51.                 int mediateWords = 0;
  52.                 while (!queue.isEmpty()) {
  53.                         mediateWords++;
  54.                         boolean flag = false;
  55.                         int size = queue.size();
  56.                         for (int i = 0; i < size; ++i) {
  57.                                 String thisString = queue.poll();
  58.                                 unvisited.remove(thisString);
  59.                                 queue.offer(thisString);
  60.                         }
  61.                         for (int i = 0; i < size; ++i) {
  62.                                 
  63.                                 String nextString = queue.poll();
  64.                                 layerMap.put(nextString, mediateWords);
  65.                                 List<String> neighborsOfNextString = findNeighbors(nextString);
  66.                                 neighborMap.put(nextString, neighborsOfNextString);
  67.                                 for (String string : neighborMap.get(nextString))
  68.                                 {
  69.                                         queue.offer(string);
  70.                                         if (string.equals(endWord))
  71.                                                 flag = true;
  72.                                 }

  73.                         }
  74.                         if (flag)
  75.                                 return mediateWords;
  76.                 }
  77.                 return -1;
  78.         }

  79.         // find all neighbors in unvisited set of this originString
  80.     private List<String> findNeighbors(String originString) {
  81.             int length = originString.length();
  82.             char[] charArray = originString.toCharArray();
  83.             List<String> neighbors = new ArrayList<>();
  84.             for (int i = 0; i < length; ++i) {
  85.                     char c = charArray[i];
  86.                     for (int j = 0; j < 26; ++j) {
  87.                             charArray[i] = (char)('a' + j);
  88.                             if (unvisited.contains(String.valueOf(charArray)) && (charArray[i] != c)) {
  89.                                     neighbors.add(String.valueOf(charArray));
  90.                             }
  91.                             //System.out.println(charArray[i]);
  92.                     }
  93.                     charArray[i] = c;
  94.             }
  95.             return neighbors;
  96.     }
  97.         public static void main(String[] args) {
  98.             String beginWord = "a";
  99.             String endWord = "c";
  100.             Set<String> wordList = new HashSet<String>(Arrays.asList("a","b","c"));
  101.             Solution solution = new Solution();
  102.             List<List<String>> lists = solution.findLadders(beginWord, endWord, wordList);
  103.             for (List<String> list : lists ) {
  104.                     System.out.println(Arrays.toString(list.toArray()));
  105.             }
  106.             
  107. //            for (String string : solution.findNeighbors(beginWord, wordList)) {
  108. //                    System.out.println(string);
  109. //            };
  110.     }
  111. }
复制代码

评分

参与人数 1大米 +50 收起 理由
阿童木 + 50

查看全部评分


上一篇:有没有一起刷题的小伙伴
下一篇:air bnb csv parser求助
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表