注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
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 进行搜索- public class Solution {
- Set<String> unvisited;
- Map<String, List<String>> neighborMap = new HashMap<>();
- Map<String, Integer> layerMap = new HashMap<>();
- LinkedList<String> queue = new LinkedList<String>();
- public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
- List<List<String>> results = new ArrayList<>();
- // if beginWord is equal to endWord
- if (beginWord.equals(endWord)) {
- ArrayList<String> list = new ArrayList<>();
- list.add(beginWord);
- results.add(list);
- return results;
- }
-
- unvisited = new HashSet<String>(wordList);
- unvisited.add(endWord);
- unvisited.add(beginWord);
- queue.offer(beginWord);
- int layers = BFS(beginWord, endWord, wordList); // first compute the min words in between;
- layerMap.put(endWord, layers + 1);
- //reinitialize
- unvisited = new HashSet<String>(wordList);
- unvisited.add(endWord);
- unvisited.remove(beginWord); // add the first one into stack
- List<String> stack = new ArrayList<>();
- stack.add(beginWord);
- DFS(results, beginWord, endWord, wordList, layers, stack);
- return results;
- }
- private void DFS(List<List<String>> results, String beginWord, String endWord, Set<String> wordList, int layers, List<String> stack) {
- String string = stack.get(stack.size() - 1);
- if (stack.size() == layers + 1) {
- if (string.equals(endWord)) {
- results.add(new ArrayList<>(stack));
- }
- return;
- }
- // explore all of its neighbors;
- for (String neighbor : neighborMap.get(string)) {
- if (layerMap.get(neighbor) == null || layerMap.get(neighbor) != layerMap.get(string) + 1)
- continue;
- unvisited.remove(neighbor);
- stack.add(neighbor);
- DFS(results, beginWord, endWord, wordList, layers, stack);
- unvisited.add(neighbor);
- stack.remove(stack.size() - 1);
- }
- }
- private int BFS(String beginWord, String endWord, Set<String> wordList) {
- int mediateWords = 0;
- while (!queue.isEmpty()) {
- mediateWords++;
- boolean flag = false;
- int size = queue.size();
- for (int i = 0; i < size; ++i) {
- String thisString = queue.poll();
- unvisited.remove(thisString);
- queue.offer(thisString);
- }
- for (int i = 0; i < size; ++i) {
-
- String nextString = queue.poll();
- layerMap.put(nextString, mediateWords);
- List<String> neighborsOfNextString = findNeighbors(nextString);
- neighborMap.put(nextString, neighborsOfNextString);
- for (String string : neighborMap.get(nextString))
- {
- queue.offer(string);
- if (string.equals(endWord))
- flag = true;
- }
- }
- if (flag)
- return mediateWords;
- }
- return -1;
- }
- // find all neighbors in unvisited set of this originString
- private List<String> findNeighbors(String originString) {
- int length = originString.length();
- char[] charArray = originString.toCharArray();
- List<String> neighbors = new ArrayList<>();
- for (int i = 0; i < length; ++i) {
- char c = charArray[i];
- for (int j = 0; j < 26; ++j) {
- charArray[i] = (char)('a' + j);
- if (unvisited.contains(String.valueOf(charArray)) && (charArray[i] != c)) {
- neighbors.add(String.valueOf(charArray));
- }
- //System.out.println(charArray[i]);
- }
- charArray[i] = c;
- }
- return neighbors;
- }
- public static void main(String[] args) {
- String beginWord = "a";
- String endWord = "c";
- Set<String> wordList = new HashSet<String>(Arrays.asList("a","b","c"));
- Solution solution = new Solution();
- List<List<String>> lists = solution.findLadders(beginWord, endWord, wordList);
- for (List<String> list : lists ) {
- System.out.println(Arrays.toString(list.toArray()));
- }
-
- // for (String string : solution.findNeighbors(beginWord, wordList)) {
- // System.out.println(string);
- // };
- }
- }
复制代码 |