Leetcode 17.22单词转换 dfs+回溯+剪枝
JAVA:
public final List<String> findLadders(String beginWord, String endWord, List<String> wordList) { List<String> re = new LinkedList<String>(); Set<String> set = new HashSet<>(), his = new HashSet<>(); boolean exit = dfs(re, set, his, beginWord, endWord, wordList); if (exit) re.add(0, beginWord); return re; } private final boolean dfs(List<String> re, Set<String> set, Set<String> his, String curr, String endWord, List<String> wordList) { for (int i = 0; i < wordList.size(); i++) { String next = wordList.get(i); if (set.contains(next) || !this.canBeNext(curr, next) || his.contains(curr)) continue; set.add(next); re.add(next); if (next.equals(endWord) || dfs(re, set, his, next, endWord, wordList)) return true; set.remove(next); re.remove(re.size() - 1); his.add(next); } return false; } private final boolean canBeNext(String pre, String next) { int len = pre.length(), diff = 0; for (int i = 0; i < len; i++) { if (pre.charAt(i) != next.charAt(i)) { if (diff == 0) diff++; else return false; } } return diff == 0 ? false : true; }
JS:
/** * @param {string} beginWord * @param {string} endWord * @param {string[]} wordList * @return {string[]} */ var findLadders = function (beginWord, endWord, wordList) { let re = []; let hasRe = dfs(re, beginWord, new Set(), new Set(), endWord, wordList); if (hasRe) re.unshift(beginWord); return re; }; var dfs = function (re, curr, set, his, endWord, wordList) { for (let i = 0; i < wordList.length; i++) { let next = wordList[i]; if (set.has(next) || his.has(next) || !canBeNext(curr, next)) continue set.add(next); his.add(next); re.push(next); if (next == endWord || dfs(re, next, set, his, endWord, wordList)) return true; set.delete(next); re.pop(); } return false; } var canBeNext = function (pre, next) { if (!pre || !next) return false; let len = pre.length, diff = 0; for (let i = 0; i < len; i++) { if (pre.charAt(i) != next.charAt(i)) { if (diff == 0) diff++; else return false; } } return diff == 1; }
当你看清人们的真相,于是你知道了,你可以忍受孤独
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-06-13 多路多线程 reactor 模型的实现