这道题可以考虑两种方式解决
1. 深度优先遍历
2. 广度优先遍历
其中算法的效率取决于数组中单词的顺序,如果解决方案靠前,那么深度优先所用时间短;如果解在中间的位置,那么广度优先用时较短
深度优先采用回溯递归调用的方式
public int ladderLengthTraceback(String start, String end, Set<String> dict) { List<String> words = new ArrayList<String>(); List<String> result = new ArrayList<String>(); backtrack(start, end, dict, words, result); if(result.isEmpty()){ return 0; } return result.size()+1; } private void backtrack(String start, String end, Set<String> dict, List<String> words, List<String> result){ if(start.equals(end)){ if(result.isEmpty() || words.size() < result.size()){ result.clear(); result.addAll(words); } return; }else if (!result.isEmpty() && words.size()>= result.size()){ return; } List<String> cw = new ArrayList<String>(); for(int i=0; i<start.length(); i++){ char[] startCharArray = start.toCharArray(); for(int j=0; j<26; j++){ startCharArray[i] = (char)('a' +j); String word = new String(startCharArray); if((dict.contains(word) && !words.contains(word)) || word.equals(end)){ cw.add(word); } } } for(String word : cw){ int size = words.size(); words.add(word); backtrack(word, end, dict, words, result); words.remove(size); } }
广度优先采用队列循环的方式
public int ladderLength(String start, String end, Set<String> dict){ if (start == null || end == null || start.equals(end) || start.length() != end.length()) return 0; if (isOneWordDiff(start, end)) return 2; Queue<String> queue=new LinkedList<String>(); HashMap<String,Integer> dist=new HashMap<String,Integer>(); queue.add(start); dist.put(start, 1); while(!queue.isEmpty()) { String head=queue.poll(); int headDist=dist.get(head); //从每一个位置开始替换成a~z for(int i=0;i<head.length();i++) { for(char j='a';j<'z';j++) { if(head.charAt(i)==j) continue; char[] s = head.toCharArray(); s[i]=j; String sb = new String(s); if(sb.toString().equals(end)) return headDist+1; if(dict.contains(sb.toString())&&!dist.containsKey(sb.toString())) { queue.add(sb.toString()); dist.put(sb.toString(), headDist+1); } } } } return 0; } private boolean isOneWordDiff(String a, String b) { int diff = 0; for (int i = 0; i < a.length(); i++) { if (a.charAt(i) != b.charAt(i)) { diff++; if (diff >= 2) return false; } } return diff == 1; }
相关推荐
在Python-leetcode题解之126-Word-Ladder-II中,首先会介绍如何使用Python代码来解决“Word Ladder”问题。由于这不仅仅是寻找是否存在一条路径,而是要找到所有可能的最短路径,因此这个问题的难度级别比“Word ...
在leetcode的编程挑战中,126号问题“Word Ladder II”是一个较为复杂的单词转换游戏。问题要求编写一个算法找到所有单词转换序列的最短路径,这些单词序列由给定单词列表中的单词组成,每个单词仅比前一个单词的...
Python-leetcode题解之127-Word-Ladder的知识点整理: 一、LeetCode 127题简介 127题“Word Ladder”是...Python-leetcode题解之127-Word-Ladder不仅锻炼了对BFS算法的理解和应用,也为处理实际问题提供了思路和方法。
本文探讨的是leetcode中127号问题——Word Ladder(单词梯度)的JavaScript解法。 Word Ladder问题是一个经典的字符串转换问题,要求给定一个起始单词beginWord,一个结束单词endWord和一个单词列表wordList,我们...
8. **Word Ladder II**:这是一个词链问题,涉及到广度优先搜索和回溯法,寻找从一个单词转换到另一个单词的最短路径。 9. **Regular Expression Matching**:这个涉及到字符串匹配和动态规划。实现一个函数来判断...
9.1 单词变换路径(Word Ladder) 9.1.1 是否存在变换路径 9.1.2 所有最短变换路径9.2 包围区域 10. 深度优先搜索 10.1 N皇后问题 10.2 恢复IP地址 10.3 集合元素之和 10.3.1 元素可以重复 10.3.2 元素不可重复 ...